《SLAM机器人基础教程》第三章 单片机与STM32:ADC与电压检测实验

3.9节 ADC与电压检测实验

本节介绍STM32的ADC模拟数字转换外设。

a.实验准备:USB转串口模块,ST-Llink下载器,CHEAPX机器人控制板

b.实验目的:STM32实现电源电压的数据采集

c.相关知识点:

本次碰撞模块使用开关按键式碰撞,开关按键常常伴有抖动,因此需要软件消除抖动。

d.编程及运行

(1)初始化

void initBattery(void)
{     
    ADC_InitTypeDef ADC_InitStruct; 
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE );//使能GPIOC和ADC通道1的时钟
    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频系数,频率为72M/6=12M
               
  //配置GPIO    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;    //模拟输入模式
    GPIO_Init(GPIOC, &GPIO_InitStruct);              //传入结构体GPIO_InitStruct,配置GPIO C0
    
    //配置ADC
    ADC_DeInit(ADC1);  //ADC1寄存器复位
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;    //独立模式
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;        //失能多通道模式
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//失能连续转换模式
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //非外部转换触发
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;                  //ADC数据右对齐
    ADC_InitStruct.ADC_NbrOfChannel = 1;    //ADC通道数
    ADC_Init(ADC1, &ADC_InitStruct);        //传入结构体ADC_InitStruct,配置ADC1 
    ADC_Cmd(ADC1, ENABLE);                  //开启ADC1
    
    ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));    //复位校准寄存器
    ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));          //校准ADC1

}    

(2)更新函数

//获取ADC1通道channel转换值
u16 BatteryUpdate(void)   
{
  //配置通道,序列数和采样时间
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_71Cycles5 );    //ADC1,通道1,1个序列,71.5周期                      
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);           //开启换算    
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待换算结束
    
    return ADC_GetConversionValue(ADC1);             //返回转换结果
}
      

(3)主函数

//ADC与电压检测实验
int main(void)
{        
    u16 adcx=0;
    u16 volt=0;
    
     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //PriorityGroupConfig NVIC中断分组设置 组2(2位抢占优先级,2位响应优先级)
    initDebugSerial(500000);//初始化调试串口USART1,波特率500000
    initSysTick();//初始化滴答定时器和TIM4定时器
    showVersion();//显示版本
    initBattery();//初始化电池检测
    while(1)
    {
        adcx=BatteryUpdate();   //读取ADC返回值
        volt=adcx*2500/4096*7;  //转换成电压值:稳压参考值2500mV,ADC级数4096,电池分压采样比例2/14
        printf("Bat=%umV\r\n",volt);    
        delay_ms(1000);
    }
    
}

(4)实验结果

猜你喜欢

转载自www.cnblogs.com/Baron-Lu/p/13378707.html