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

这篇具有很好参考价值的文章主要介绍了看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 实验目的

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

2. 实验准备和流程

看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验
由上图可以看到, ADC1 的通道 5是对应着引脚PA5的。
看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验
板子右边是GND,ADC,TPAD引脚,做实验时,把两者相连即可读电压值。

ADC时钟:
看野火的视频,用正点原子的板子(STM32F4探索者)做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转换中断函数

看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验
看野火的视频,用正点原子的板子(STM32F4探索者)做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函数

看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验
这是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相连,结果如下图:
看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验ADC和GND相连,结果如下图:
看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验文章来源地址https://www.toymoban.com/news/detail-488318.html

到了这里,关于看野火的视频,用正点原子的板子(STM32F4探索者)做ADC读取电压实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包