看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验

您所在的位置:网站首页 stm32f4原理图 看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验

看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验

#看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验| 来源: 网络整理| 查看: 265

1. 实验目的

使用STM32F4的ADC1通道5(PA5)来采样外部电压值(这里采样两个电压值TPAD(3.3v),GND(0v)),最后通过串口打印电压值。

2. 实验准备和流程

由上图可以看到, ADC1 的通道 5是对应着引脚PA5的。 板子右边是GND,ADC,TPAD引脚,做实验时,把两者相连即可读电压值。

ADC时钟: 这里是用于模拟电路的时钟,就是APB2的时钟,这里的时钟是84MHZ,PCLK2:APB2高速总线时钟。

具体的流程如下: 初始化GPIO和ADC; 编写ADC转换中断函数; 编写main函数。

2.1 初始化GPIO和ADC

ADC转换模式有两种:1、单次转换 2、连续转换模式

在连续转换模式下CONT 位为 1时,ADC 结束一个转换后立即启动一个新的转换。将ADC配置连续模式,只需要在第一次转换时给触发信号,后面不需要再给。

在单次转换模式下,ADC 执行一次转换。给一次触发信号,触发一次ADC转换。

这里开启连续转换模式。

//初始化GPIO 设置ADC1的通道5来进行AD转换的,是PA5引脚 static void ADCx_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构体 ADC_CommonInitTypeDef ADC_CommonInitStructure; //初始化CCR寄存器结构体 ADC_InitTypeDef ADC_InitStructure; //初始化ADC1参数 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟 //初始化结构体变量 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PA5通道5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; //不带上下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束 //初始化通用配置 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //两个采样阶段之间的延迟5个时钟 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //预分频4分频。ADCCLK = PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz ADC_CommonInit(&ADC_CommonInitStructure); //初始化 //初始化ADC1相关参数 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //12位模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换 ()()() ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //禁止触发检测,使用软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐方式:右对齐 ADC_InitStructure.ADC_NbrOfConversion = 1; //1个转换在规则序列中 ADC_Init(ADC1, &ADC_InitStructure); //ADC初始化 ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器 ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //ADC转换结束产生中断,在中断服务程序中读取转换值,开启中断 ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_480Cycles ); //设置指定 ADC 的规则组通道,一个序列,采样时间 ADC_SoftwareStartConv(ADC1); //软件触发 } static void ADC_NVIC_Config(void){ //NVIC初始化结构体 NVIC_InitTypeDef NVIC_InitStruct; //设置中断优先级的分组 //就是设置主抢占优先级和子抢占优先级各是几,这里是分组为1,代表主优先级可以是0和1(就是1个位来设置主优先级),子优先级是0-7,是2的3次方 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置ADC为中断源 NVIC_InitStruct.NVIC_IRQChannel = ADC_IRQn; //配置抢占优先级 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //配置子优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //使能中断 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } void ADC1_Init(void){ ADCx_Config(); ADC_NVIC_Config(); } 2.2 编写ADC转换中断函数

这里转换数据结束就会产生中断(使用的是规则通道,不是注入通道),然后进入中断中读取ADC采集到的值。

uint16_t ADC_Value = 0; void ADC_IRQHandler(void){ if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == SET){ //表示中断已经来了,EOC=1,代表数据转换结束 ADC_Value = ADC_GetConversionValue(ADC1); //获取ADC数据 } //printf("irrpt_value\r\n"); ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); } 2.3 编写main函数

这是ADC采集到的值转换成电压的公式,就是比例关系:3.3:4096 = x:采集到的数值。

float ADC_ConvertedValueLocal; //存储转换的电压值 extern uint16_t ADC_Value; int main(void) { USART_Config(); ADC1_Init(); delay_init(168); while(1){ delay_ms(500); ADC_ConvertedValueLocal = (float)ADC_Value/4096*3.3; printf("\r\n The current AD value = 0x%04X \r\n",ADC_Value); printf("\r\n The current AD value = %.4fV \r\n",ADC_ConvertedValueLocal); printf("\r\n\r\n"); delay_ms(500); } } 3. 实验结果

ADC和TPAD相连,结果如下图: ADC和GND相连,结果如下图:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3