前言
本文是基于嵌入式开发板CT117E,stm32f103RBT6。"空手套白狼"就是直接利用官方给的库(v3.5),进行拷贝修改形成可以正常运行的代码。
一、原理图
二、由原理图得到的信息
- 可调变阻器连接的是PB0,查芯片手册得是ADC1的8通道。
三、ADC1初始化
1.adc的采集需要初始化开发板上的可变电阻器的连接io口,PB0,连接的是开发板的ADC1,通道8。
2. 需要初始化两个结构体,一个是GPIO,一个是自身的结构体。这里不使用中断模式,我们使用软件使能获取adc数据。
3. 初始化函数: 复制拷贝库文件,不用自己敲代码记结构体名字。打开固件库的ADC目录RegSimul_DualMode,178行的GPIO初始化直接复制,修改端口;86行有ADC1的初始化结构体,到95行,修改初始化通道数为1,选择为独立模式和disable多通道扫描;最后修改95行规则通道初始化函数为通道8;最后我们需要使能ADC1,开启复位校准,等待,开启校准,等待,开启软件启动ADC1;
STM32固件库代码V3.5版\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\ADC\RegSimul_DualMode\main.c
void adc_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channels configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_13Cycles5);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable Vrefint channel17 */
//ADC_TempSensorVrefintCmd(ENABLE);
/* Enable ADC1 reset calibration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //容易忘记漏掉
}
四、ADC获取数据函数
ADC_GetConversionValue(ADC1); //获取ADC的12位数据值,库函数直接使用
五、ADC在主函数的应用方法
float adc_val;
while(1)
{
if(adc_flag==1) //这个标志位在滴答计时器的中断中,每100ms置1,也就是adc的刷新时间0.1s
{
adc_val=ADC_GetConversionValue(ADC1); //这里获取到的是12位的adc数据
sprintf((char *)adc_buff,"ADC: %0.2f" ,adc_val/0xfff*3.3); //转换为电压值,0-3.3,然后以字符串的形式存放在adc_buff中,用于在lcd显示上。
adc_flag=0;
}
}