adc基础知识http://t.csdnimg.cn/x6phu
一、(单通道)使用定时器触发的adc单通道转换
我用的单片机是stm32f103cbtx
- 定时器:使用pwm输出的模式
- adc:使用dma的模式(在不使用dma的情况下,定时器控制adc进行数据采集只能是单通道!如果开启了多通道,读取到的adc采集值只会是最后一个通道的值!所以,要想使用定时器控制adc采集多通道,必须使用dma!)
定时器中cubemx配置:
pwm模式1和模式2区别:
以下是使用逻辑分析仪观察到的pwm输出情况
adc中cubemx配置:
dma模式选择:
参考别人的试了用了circular模式,完全没问题,可以成功测出电压值。
我自己也试了normal模式,不行,只能测一次,后面没反应了。
代码:
uint8_t adcconvend=0;
int main()
{
uint16_t adc_value[4]= 0;
hal_tim_base_start(&htim1);
hal_tim_pwm_start(&htim1, tim_channel_2);
hal_adcex_calibration_start(&hadc1);//自动校准
hal_adc_start_dma(&hadc1, (uint32_t *)adc_value, 4);
while(1)
{
if(adcconvend)
{
uint16_t averagevalue = 0;
for(int i = 0; i < 4; i++)
{
averagevalue += adc_value[i];
printf("adc_value[%d]:%.3f\r\n",i,(float)adc_value[i]*3.3f/4096);
}
adcconvend=0;
averagevalue/=4;
printf("averagevalue:%d\r\n",averagevalue);
}
}
void hal_adc_convcpltcallback(adc_handletypedef* hadc)
{
if(hadc==&hadc1)
{
adcconvend=1;
}
}
结果:
二、(双通道)使用定时器触发的adc双通道转换
adc中cubemx配置:
三、关于pwm的频率或周期的计算
*注 :* arr和psc都是16位的寄存器, 数值一定要在0~65535这个范围。
当我们设置了当前机器设置的是 72mhz和 72分频,定时器输入时钟频率是72mhz / 72 = 1mhz:
- 1mhz ,即1秒计数 1m 次=1000000 次(1s产生1000000个脉冲方波)。
- 1mhz ,也就是1us产生1个脉冲方波。
若重装载值 (period 或 arr)设置为 500。也就是0.1us*500=500us,对于当前 pwm 周期为 500us,也就是500us发生一次中断。
四、寄存器timx_arr、timx_ccrx 、timx_cnt
上图可以看出:
- 0-t1段,定时器计数器timx_cnt值小于ccrx值,输出低电平。
- t1-t2段,定时器计数器timx_cnt值大于ccrx值,输出高电平。
当timx_cnt值达到arr时,定时器溢出,重新向上计数...循环此过程至此一个pwm周期完成。
上图更加形象的说明了
信号频率由 timx_arr 寄存器值决定。
占空比则由 timx_ccrx 寄存器值决定。
参考:
stm32 hal库:adc+dma应用(连续采样、触发采样)_hal adc dma-csdn博客
【stm32】定时器tim触发adc采样,dma搬运到内存(超详细讲解)-csdn博客
发表评论