STM32 ADC输入采集电压
#include "stm32f10x.h" // Device header
#include "stdio.h"
#include "delay.h"/*********************串口调试输出**********************/void led()//led PE5初始化
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStruct);
}
void CUSART_init()//串口初始化函数
{GPIO_InitTypeDef GPIO_InitStruct;//GPIO结构体USART_InitTypeDef USART_InitStruct;//USART结构体NVIC_InitTypeDef NVIC_InitStruct;//中断结构体RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;//设置RX,TX端口串口使能GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//设置端口浮空输入GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;//设置RX,TX端口串口使能GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);USART_InitStruct.USART_BaudRate=9600;//波特率USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流设置USART_InitStruct.USART_Mode=USART_Mode_Tx | USART_Mode_Rx;//设置串口模式USART_InitStruct.USART_Parity=USART_Parity_No;//不使用奇偶校验USART_InitStruct.USART_StopBits=USART_StopBits_1;//设置停止位 1USART_InitStruct.USART_WordLength=USART_WordLength_8b;//传输或接受传输数据位USART_Init(USART1,&USART_InitStruct);USART_Cmd(USART1,ENABLE);//使能串口USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启串口接受中断 NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);
}#define USAERT_REC_LEN 200
unsigned char USART_RX_BUF[USAERT_REC_LEN]; //接受缓冲
unsigned int USART_RX_STA =0; //接受状态标志位/*
USART_RX_STA 定义为一个 16进制的标志位
接收到 0x8000 为 1000 0000 0000 0000 最高位(第15位)接收到1,表示接受完成
接收到 0x4000 同上第14位接收到1,表示接受到0x0d
0d 表示回车
oa 表示换行
以0d,0a结尾表示接收完成
注意:蓝牙和STM32的波特率必须一致
如需使用蓝牙app与MCU通信将TX接到RX
*/
void USART1_IRQHandler()//串口一中断服务函数
{unsigned char res; //将接受的数据存放dataif(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)//接受的数据以0x0d,0x0a结尾{res=USART_ReceiveData(USART1);//读取接受数据if((USART_RX_STA&0x8000)==0)//接受未完成{if(USART_RX_STA&0x4000)//接收到0x0d{if(res != 0x0a)//如果未接受到0x0a{USART_RX_STA=0;}else{USART_RX_STA|=0x8000;//接收完成 }}else//如果未接受到0x0d{if(res==0x0d)//接收到了{USART_RX_STA|=0x4000;}else{USART_RX_BUF[USART_RX_STA&0x3ffff]=res;// 0011 1111 1111 1111,储存数据个数USART_RX_STA++;//接受到的有效数据个数+1 GPIO_SetBits(GPIOE,GPIO_Pin_6);//关闭ledif(res== 0x45)//HC-05接收到0x45这个数据{GPIO_SetBits(GPIOE,GPIO_Pin_5);//关闭led}if(USART_RX_STA>(USAERT_REC_LEN-1))//接收数据出错,重新开始接受{USART_RX_STA=0;}}}}USART_SendData(USART1,res);//将储存的数据发送出去}} // 发送数据int fputc(int ch, FILE *f){USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等while (!(USART1->SR & USART_FLAG_TXE));return (ch);}// 接收数据int GetKey (void) {while (!(USART1->SR & USART_FLAG_RXNE));return ((int)(USART1->DR & 0x1FF));}/****************************ADC转换********************************************/
void Adc_cfg()
{ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道时钟//PA1 作为模拟通道输入引脚 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14MADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式ADC_InitStructure.ADC_ContinuousConvMode =DISABLE; //模数转换工作在单次转换模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1ADC_ResetCalibration(ADC1); //使能复位校准 while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束ADC_StartCalibration(ADC1); //开启AD校准while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束// ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{//设置指定ADC的规则组通道,一个序列,采样时间ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}u16 Count_AdcVal(u8 ch,u8 times)
{u32 temp_val=0;u8 t;for(t=0;t<times;t++){temp_val+=Get_Adc(ch);Delay_ms(5);}return temp_val/times;;
}int main()
{float temp;u16 value;Adc_cfg();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);CUSART_init();led();GPIO_ResetBits(GPIOE,GPIO_Pin_5); printf("Set OK!\n");while(1){Delay_ms(500);value=Count_AdcVal(ADC_Channel_1,20);temp=(float)value * 3.3/4096;printf("%2.2f\t",temp);Delay_ms(500);}}
接线:ADC1电压采集端口PA1
坑:程序无问题,如遇到PA1接GND不为0V,只需将Verf接至3.3V,作为芯片的外部参考基准输入。把这两者连接,就是使用Vref作为参考基准
Verf:Vref就是指输入的模拟电压的最大值, 用于比较输入电压, ADC的输入的有效范围:0-Vref, 如果是10bit ADC,Vref=5v, 2^10(1024):5v, 那么ADC的分辨率为5/1024=0.00488v
STM32 ADC输入采集电压相关推荐
- stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...
1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章我们将向大家介绍探索者 STM32F4 开发板自带的 ...
- STM32 ADC多通道采集
ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...
- STM32+LTC6804/LTC6811采集电压温度电流/BMS储能采集板
有LTC6804.LTC6811版本,可选SPI\菊花链通信) BMS闲置开发板 凌力尔特LTC6804/6811开发板BMS电池管理评估板,采集板,BMS开发板 12串送源码+BOM+原理图+源码解 ...
- STM32 ADC没有输入电压时,采集结果不为0
目录 1. 问题概述 2. 问题分析 2.1 钳位二极管 2.2 反向漏电流 3. 复用功能 4. 总结 1. 问题概述 硬件焊接完成后测试程序ADC采集功能,先通过接入3.3V来看下.结果发现三个通 ...
- STM32——ADC采集
目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 D ...
- GD32 ADC采集电压
文章目录 ADC TIM DMA 其他一些初始化 main 总结 使用芯片为GD32F307 ADC 连续转换模式,可以运行在规则组通道上,一旦相应软件触发或者外部触发产生,ADC就会采样和转换规定的 ...
- 晓宇姐姐带你软硬结合,感受下ADC DMA采集多路电压电流
在我们的电子设计中,经常需要对外部的模拟量进行采集,如一些传感器的输出量,电位器的旋转量等等,特别是电压电流的采集可以说是家常便饭,这些都离不开MCU最常用的外设,ADC,它可以将模拟量转换为数字量, ...
- 小壁虎EFM32之ADC 采集电压
前言 最近在学习小壁虎EFM32芯片的使用,需要用ADC采集电压,学习之中,遇到一些小问题和需要注意的地方,现将其记录下来,避免以后自己再次踩坑和往后可以学而时习之:好了,进入正题. 代码 主函数: ...
- Arduino Uno 使用 ADC采集电压在LCD上显示
Arduino Uno 使用 ADC采集电压显示在LCD上 前言 所需组件 电路图及说明 Arduino使用ADC 代码 前言 在本教程中,我们将在 ARDUINO UNO 中介绍 ADC(模数转换) ...
最新文章
- 我看过的数据库方面的好文章
- C# Lambda 和 匿名函数的GC总结
- 成长 | 《大厂晋升指南》学习总结(中)
- openerp mysql_Odoo字段(Fields)总结-至2020全
- 从Element ui看开发公共组件的三种方式
- python class类的self_Python类class参数self原理解析
- 有关Unity编辑器
- excel输出线性拟合曲线的斜率
- linux qt程序崩溃_Qt程式异常崩溃处理技巧(Win)
- 《大清重臣李鸿章·上下》—— 读后总结
- python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
- 数据库视图view简介
- python期货基本面分析_用python对股票期货做时序分析
- 苹果 CEO 库克“喜当爹”,女子为其孕育双胞胎,索赔31.6亿分手费!
- 基本软件开发模型:瀑布模型、V型模型、迭代模型、增量模型、螺旋模型、大爆炸模型、敏捷模型、原型模型、W模型 特点分析与总结
- android launcher 4x5应用排列,修改华为刷机包桌面应用图标布局排序的方法
- 忆联发布数据中心级NVMe SSD——UH711a以及UH711a E3.S形态
- 昆明计算机ppt培训机构,师友互助实操培训(昆明)ppt课件.ppt
- opencv的mat赋值_OpenCV Mat 类型定义和赋值
- 记一次我的Google电话面试经历