目录
一、实验目的
二、电路连接
三、实验执行(五步)
1.初始化ADC的IO引脚
2.配置ADC的时钟,注意要小于14MHz
3.根据ADC的编程接口 实现初始化ADC的基本参数
4.配置常规序列并闭合触发输入开关
5.闭合总开关、启动并读取转换结果
四、代码
一、实验目的
使用ADC实现:根据光敏传感器的光照强弱去得到不同的输入电压对应的量化结果码(使用软件触发常规序列的执行),既而根据得到的量化值*分辨率得到不同的电压 然后去实现板载灯的亮灭(因为日光灯照度一般10lux,其对应的AO输出电压为1.5V,所以以1.5V为边界实现板载灯的亮灭)。
二、电路连接
三、实验执行(五步)
ADC的执行(五步):初始化ADCIO、配置时钟、ADC_Init、配置常规序列/注入序列、闭合触发输入开关和总开关
1.初始化ADC的IO引脚
2.配置ADC的时钟,注意要小于14MHz
3.根据ADC的编程接口 实现初始化ADC的基本参数
其中,值得注意的是:EOC和JEOC标志位,EOC是end of convert,另一个是Inject开头的
常规序列的第一个是配置常规序列的内容,即配置哪个通道,采样时间多少
连续模式:一旦启动 ADC,它会 不停地对同一个通道采样和转换,转换完一轮马上开始下一轮,像水龙头开着一样,结果源源不断。----针对一个通道
对齐方式:一般选择右对齐,方便计算
外部触发这里选择软件触发
双ADC表示是否使用两个ADC来执行操作
通道数:表示你要使用几个通道,这里是只使用1个
扫描模式:如果你配置了 多个通道,ADC 会按照你设定的顺序 一个接一个地采样、转换。
例如:先测通道 0,再测通道 1,再测通道 2……直到结束一轮。------针对多个通道
4.配置常规序列并闭合触发输入开关
首先配置序列计划,参数依次是ADC名称,选择第几个通道,在序列计划在排第几,采样时间(注意这个采用时间 给的是默认是一些固定的时间参数,这里选择与光敏传感器(10.24)最接近的13cycle)
之后闭合触发输入的开关 以及闭合ADC总开关
5.闭合总开关、启动并读取转换结果
先清楚标志位
发送软件触发的输入信号
当标志位从0-1表示常规序列完成了,注意不是一次转换完成,而是一次常规序列都完成了
读取这个值,并把这个值转为近似的电压,做后续操作
四、代码
#include "stm32f10x.h"
#include "Delay.h"
#include "usart.h"
void App_GPIO_Init(void);
void App_ADC_Init(void);int main(void)
{//使用ADC实现软件触发的单通道转换//ADC初始化 //其中注意输入电压的内阻已经得到,并且因此得到的采样时间是10.24cycleApp_GPIO_Init();App_ADC_Init();while(1){//先清零EOC标志位ADC_ClearFlag(ADC1,ADC_FLAG_EOC);while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);uint16_t res=ADC_GetConversionValue(ADC1); float volt=res*(3.3f/4095);if(volt>1.5){GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}else{GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}}
}
void App_GPIO_Init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);}
void App_ADC_Init(){//首先就是初始化ADC的IORCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct={0};GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;GPIO_Init(GPIOA,&GPIO_InitStruct);//初始化后开启时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//初始化ADCADC_InitTypeDef ADC_InitStruct={0};ADC_InitStruct.ADC_ContinuousConvMode=DISABLE;ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;ADC_InitStruct.ADC_NbrOfChannel=1;ADC_InitStruct.ADC_ScanConvMode=DISABLE;ADC_Init(ADC1,&ADC_InitStruct);//配置常规序列ADC_RegularChannelConfig(ADC1,0,1,ADC_SampleTime_13Cycles5);ADC_ExternalTrigConvCmd(ADC1,ENABLE);//开启总开关ADC_Cmd(ADC1,ENABLE);}