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 ",volt); delay_ms(1000); } }
(4)实验结果