本项目用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开始设置。