stm32f303定时器触发ADC采样并通过DMA传输

最近在做功率计,本来以为HAL_ADC_Start和Stop一下完事,但是老板那边让我用定时器触发ADC再DMA传输,还得加上串口和can通信,之后通过自带的运放,做成量程可变的功率计,最后移植到freertos上。

1.TIM+ADC+DMA

我们用ADC的规则通道(注入通道类似),首先要配置它的工作状态:单通道还是多通道,单次转换还是连续转换
在这里插入图片描述
这里我暂时用了ADC1和ADC2,分别一个通道,所以不用开启扫描模式。如果是多通道,每个通道都要转换则需要开启扫描模式。
由于我们需要定时器去触发ADC转换,如果是连续模式,定时器触发一次就不会结束了。要设置成单次模式,定时器触发一次,转换一次。
在这里插入图片描述
接下来是ADC的时钟,ADCCLK是由PCLK分频得到:
在这里插入图片描述
在这里插入图片描述
配置好后开启DMA,数据长度可以为Word或HalfWorld,设置为circle模式,让DMA不停搬运
在这里插入图片描述
配置高级定时器TIM8的TRGO为更新事件,设置定时器计数频率和装载值
在这里插入图片描述
选择ADC的触发源为TIM8 TRGO,并设置采样周期
在这里插入图片描述
生成代码打开cube,调用初始化函数。

HAL_TIM_Base_Start(&htim8);//开启定时器
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Value1,(uint32_t)AVER*ADC1_CH);//开启ADC1 DMA1
HAL_ADC_Start_DMA(&hadc2,(uint32_t*)ADC_Value2,(uint32_t)AVER*ADC2_CH);//开启ADC2 DMA2

对HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc,uint32_t* pData,uint32_t Length)说明:
该函数第一个参数指定了ADC的结构体,第二个指明了内存中存放ADC数据的位置,第三个则确定了存放数据的数组长度(若有多个通道,则此数组中数据顺序为ch1,ch2,ch3再ch1,ch2,ch3如此循环。
在这里插入图片描述
当你只采用1个ADC挂在一个DMA时一般不会出现什么问题。当你开了两个ADC的DMA时,程序可能会卡死,在一直进DMA的中断,具体原因未知,但和ADCCLK(即分频系数),AVER(即每个通道采样个数)和sample time(即每通道采样时间)有关。
经探究,让该函数执行的时间越长,越能顺利运行,即AVER越大,TCONV越大(每通道采样时间越长,ADCCLK越小即分频系数越大)
做ADC相关一定将上述参数调校合适

2.OPAMP

调完再写

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值