单片机学习小组
直播中

h1654155598.0450

13年用户 668经验值
私信 关注

如何用定时器和中断的方式采集单路电压?

如何用定时器和中断的方式采集单路电压?

回帖(1)

贾永世

2022-2-21 13:52:14
用DMA采集单路电压总是出错,就用了定时器和中断的方式
开启定时器HAL_TIM_Base_Start_IT(&htim17);//timer
10ms定时器中断到了,开启电压采集,进行电压判断(注意这是上一次采集的电压,所以会有10ms延时)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//10ms
{
    uint32_t ad_temp;
    if (htim->Instance == htim17.Instance)
    {
        /* Toggle LED */
        HAL_ADC_Start_IT(&hadc);
        if(ADC_num < 2048)
            HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
        else HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);

}
AD采集完成中断,停止AD采集,停止定时器,获取电压值,开启定时器
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)   
{
    HAL_ADC_Stop_IT(hadc);      
    HAL_TIM_Base_Stop_IT(&htim17);   
    ADC_num = HAL_ADC_GetValue(hadc);   
    HAL_TIM_Base_Start_IT(&htim17);      
}
注意!!!ADC配置中,由于时钟是48MHz,所以ClockPrescaler为Synchronous clock mode divided by 4,这样ADC的时钟为12MHz(ADC时钟不能超过14MHz)
举报

更多回帖

发帖
×
20
完善资料,
赚取积分