如图,这是最近做的全桥移相的一个实验板,只包含了控制和驱动还有功率管,主控是F334。比较业余板子做的不怎么样,勿喷。
前段时间开始写程序,先是遇到HR
tiM的问题,后来摸索10来天,问题基本搞定,已经上电试过,没发现问题。现在开始写PID算法,算法写出个框架了,可是在写ADC采样程序的时候遇到了出乎意料的问题。
问题是这样的,
1、我想在每个周期的上升沿进行电流采样,每个周期的下降沿停止采样,来计算每个周期的有功功率和一些其它参数。由tim3更新事件来触发ADC转换,然后用中断(中断可以是来自HRTIM或者外部PWM的周期上下沿中断)来开启和关断TIM3。ADC的数值由ADC的中断读入到数组。由于在实际应用中频率是变化的,所以没办法使用DMA来确定每个周期需要采集的点数。其实用不用DMA都无所谓,主要是遇到一下问题。
TIM3的时钟是72M,周期为72,由它来驱动ADC,采样率应该是1M,当对40KHZ进行采样的时候,周期25us,所以对应的AD采样点也应是25个点才对,但是我的数组出来的个数是乱七八糟的,有时候多有时候少,更改TIM3的周期寄存器,也就是更改触发的速度,数组里的采样点的数量变化的也不对,反正就是对不上。
2、后来干脆去掉TIM3触发,由PWM上下沿中断直接软件启动和关闭ADC,同时在ADC的中断读取数值,奇怪的是,40K的PWM,总采样时间25us,但是得到的点数才10多个,难道ADC转换速度这么慢?不是能到到5M以上吗?还有就是我把PWM频率提升到65k,心想采样点数肯定变得更少,谁知道采样点数竟然变成24个,崩溃中呀,说白了,这个ADC采样点数和由TIM3触发时差不多,采样速度不受控制,有多有少。
以上就是大概遇到问题,之前用F103的时候就这么干过,就是采样频率没有这么高而已,本以为这次没问题的地方出来这么大问题希望各位同仁帮帮忙
hadc2.Instance = ADC2;
hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc2.Init.Resolution = ADC_RESOLUTION_8B;
hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc2.Init.ContinuousConvMode = DISABLE;
hadc2.Init.DiscontinuousConvMode = DISABLE;
hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONVHRTIM_TRG1;
hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc2.Init.NbrOfConversion = 1;
hadc2.Init.DMAContinuousRequests = ENABLE;
hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc2.Init.LowPowerAutoWait = DISABLE;
hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
if (HAL_ADC_Init(&hadc2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
楼主使能了DMA,
hadc2.Init.DMAContinuousRequests = ENABLE;
但好像没有DMA处理函数。
还有,这个 sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
好像太短了,ADC采样电路充电时间太短了。
1、没有用DMA就应该关闭.否则DMA读走了ADC数据,你再去读ADC不知道是否读到应该读的数据否?
2、感觉1CYCLE_5实在太短了。
是应该关闭。因为我已经反复试过多次各种配置都是一个结果,所以也懒得去改了。我的问题不在于精度问题,而是速度问题,所以采样时间长短好像关系不大。
还有个问题请教一下,就是像我这种用PWM开启和关断TIM,然后通过TIM触发ADC开启和关断,所以采样点数是不固定的,这种情况下就没办法配置DMA传输数据的个数了。真是头疼呀
其实你可以设置连续转换模式,无需PWM或TIM触发、DMA传送数据,DMA数据满进入中断。
一周热门 更多>