文章目录
ADC编程实战:多通道采样
CubeMX配置------完全轮训
勾选需要的通道,这里拿PA2—IN2和PA6—IN6举例
参数设置这里和单通道的配置一样:4分频,12位,右对齐,扫描、连续模式关闭,转换个数1个,软件触发,采样时间56个周期
ADC实验配置步骤
adc.c
uint16_t adc_get_result(uint32_t Channel)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = Channel; /* 通道 */
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES; /* 采样时间 */
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return (uint16_t)HAL_ADC_GetValue(&hadc1);
}
main.c
uint8_t arrBuffer[1];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, arrBuffer, 1);
while (1)
{
PrintfDebug("%d %d\r\n", ADC_Read(ADC_CHANNEL_2),ADC_Read(ADC_CHANNEL_6));
}
}
CubeMX配置------DMA
这里打开扫描模式,2个转换成员,采样时间均为56个周期
添加ADC1的DMA请求,Mode选择Circular,字长为半字长(Half Word)
ADC实验配置步骤
main.c
uint8_t arrBuffer[1];
uint16_t g_iAdcx[2];
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
HAL_UART_Receive_IT(&huart1, arrBuffer, 1);
while (1)
{
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)g_iAdcx, sizeof(g_iAdcx) / sizeof(g_iAdcx[0]));
PrintfDebug("%d %d\r\n", g_iAdcx[0], g_iAdcx[1]);
}
}
补充------ADC采样滤波
限值过滤器
#include "stdlib.h" //abs()需要包含的头文件
#define ERRANGE 100 //设置的限差范围
uint16_t ADC_SetValueFilter(uint16_t value) //限值过滤器
{
uint16_t new_Value; //采集的值
value /= 1000;
value = value * 4096 / 3.3; //设置的限值
new_Value = adc_get_result(); //获取ad采样值,多采样通用
if( abs(new_Value - value) > ERRANGE) return value; //abs()取绝对值函数
return new_Value;
}
均值过滤器
//cnt为采样次数
uint16_t ADC_AverageFilter(uint8_t cnt) //均值过滤器
{
uint32_t adc_Sum = 0;
for(uint8_t count = 0;count<cnt;count++)
{
adc_Sum += adc_get_result(); //获取ad采样值,多采样通用
}
return (uint16_t)(adc_Sum/cnt);
}