stm32 ADC信号采集失败调试过程

本项目用DMA采集ADC的8个通道数据,配置ADC通道代码如下:

void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
{
    /* 配置对应ADC通道 */
    ADC_ChannelConfTypeDef adc_channel;
    adc_channel.Channel = ch;               /* 设置ADCX对通道ch */
    adc_channel.Rank = rank;                /* 设置采样序列 */
    adc_channel.SamplingTime = stime;       /* 设置采样时间 */
    HAL_ADC_ConfigChannel(adc_handle, &adc_channel); /* 初始化ADC通道 */
}

ch表示配置的是哪个通道,DMA一个周期采集多个通道,rank表示该通道在一个周期里面采集序号,如本项目配置的采集顺序如下:

adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_480CYCLES);  
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_3, 2, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_4, 3, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_5, 4, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_6, 5, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_7, 6, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_8, 7, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_9, 8, ADC_SAMPLETIME_480CYCLES);

表示DMA一个周期采集8个通道数据,第1次采集通道2数据,第2次采集通道3数据,第3次采集通道4数据。。。
笔者一开始错误的写法如下:

adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_2, 0, ADC_SAMPLETIME_480CYCLES);  
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_3, 1, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_4, 2, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_5, 3, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_6, 4, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_7, 5, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_8, 6, ADC_SAMPLETIME_480CYCLES);
adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_9, 7, ADC_SAMPLETIME_480CYCLES);

以上写法改变电路通道2引脚电压时,没有反应,改变电路通道3引脚时通道2有反应,之后的通道也都是软件通道相比于硬件通道向前错一个,在改变硬件通道9电压时软件通道8和通道9同时发生了变化,
后来发现原来采集序列不能写0,要从1开始写。
如果设置方法如下:

adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_2, 1, ADC_SAMPLETIME_480CYCLES);  
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_3, 2, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_4, 3, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_5, 4, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_6, 5, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_7, 6, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_8, 7, ADC_SAMPLETIME_480CYCLES);
//adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_9, 8, ADC_SAMPLETIME_480CYCLES);

则通道2上电时,打印出的采集效果为:
在这里插入图片描述
可见如果后面的通道不设置,后面通道采集的数据是前面递减的。

后记

ADC的通道采集序列要从1开始设置。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值