你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
请教大师们个问题,我用的是F0系列的ST,在做ADC采集,单路采集时AD值很准确,但是多路采集时,AD值与AD通道对应不上,我用的是cube软件,有遇到过的吗
没有找到相关结果
cruse
赞同来自:
同样出现过这样的问题。如果是多通道DMA,需要每次进入中断时停止采集,等到数据处理完之后再打开DMA。DMA模式选择Normal就好了。
下面是测试过可行的代码:
#define ADC_WindowSize 4 volatile uint16_t ADC_RawBuffer[ADC_WindowSize][2]; // 2代表两个通道 uint16_t ADC_SumBuffer[2]; uint16_t ADC_Filtered[2]; float ADC_Voltage[2]; float ADC_Temperature[2];
开始采集:
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_RawBuffer, ADC_WindowSize * 2);
回调函数:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { if (hadc->Instance == ADC1) { HAL_ADC_Stop_DMA(&hadc1); // !IMPORTANT! Remember to stop ADC before enabling DMA again. // Data alignment! // 这里换成您的数据处理 // Filter for each channel: Average of (ADC_WindowSize) samples. for (uint8_t channel = 0; channel < 2; channel++) { // Summing. ADC_SumBuffer[channel] = 0; for (uint8_t i = 0; i < ADC_WindowSize; i++) { ADC_SumBuffer[channel] += ADC_RawBuffer[i][channel]; } // Calculate average. ADC_Filtered[channel] = ADC_SumBuffer[channel] / ADC_WindowSize; // Convert to voltage. ADC_Voltage[channel] = ADC_Filtered[channel] * 3.3f / 4096.0f; } // Restart ADC Conversion. while (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_RawBuffer, ADC_WindowSize * 2) != HAL_OK); } }
Courage
赞同来自: 神弃-之子
niiuxingrun - .........
cube里面通道配置错误,需要把用到的通道打开,默认打开都是0通道
t289466080
DMA模式选择Normal,每次都要执行一次HAL_ADC_Start_DMA
l1w1w1
不错,学习了
要回复问题请先登录或注册
5 个回复
cruse
赞同来自:
同样出现过这样的问题。如果是多通道DMA,需要每次进入中断时停止采集,等到数据处理完之后再打开DMA。DMA模式选择Normal就好了。
下面是测试过可行的代码:
开始采集:
回调函数:
Courage
赞同来自: 神弃-之子
niiuxingrun - .........
赞同来自: 神弃-之子
cube里面通道配置错误,需要把用到的通道打开,默认打开都是0通道
t289466080
赞同来自:
DMA模式选择Normal,每次都要执行一次HAL_ADC_Start_DMA
l1w1w1
赞同来自:
不错,学习了