#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输入采集电压相关推荐

  1. stm32 adc输入电压范围_正点原子【STM32-F407探索者】第二十五章 光敏传感器实验...

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 本章我们将向大家介绍探索者 STM32F4 开发板自带的 ...

  2. STM32 ADC多通道采集

    ADC多通道采集(阻塞模式.ADC_DMA模式) ADC多通道采集(阻塞模式) ADC多通道采集(DMA模式) ADC多通道采集(阻塞模式) 1.时钟源配置 2.配置RCC时钟(选择第三个选项 Cry ...

  3. STM32+LTC6804/LTC6811采集电压温度电流/BMS储能采集板

    有LTC6804.LTC6811版本,可选SPI\菊花链通信) BMS闲置开发板 凌力尔特LTC6804/6811开发板BMS电池管理评估板,采集板,BMS开发板 12串送源码+BOM+原理图+源码解 ...

  4. STM32 ADC没有输入电压时,采集结果不为0

    目录 1. 问题概述 2. 问题分析 2.1 钳位二极管 2.2 反向漏电流 3. 复用功能 4. 总结 1. 问题概述 硬件焊接完成后测试程序ADC采集功能,先通过接入3.3V来看下.结果发现三个通 ...

  5. STM32——ADC采集

    目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 D ...

  6. GD32 ADC采集电压

    文章目录 ADC TIM DMA 其他一些初始化 main 总结 使用芯片为GD32F307 ADC 连续转换模式,可以运行在规则组通道上,一旦相应软件触发或者外部触发产生,ADC就会采样和转换规定的 ...

  7. 晓宇姐姐带你软硬结合,感受下ADC DMA采集多路电压电流

    在我们的电子设计中,经常需要对外部的模拟量进行采集,如一些传感器的输出量,电位器的旋转量等等,特别是电压电流的采集可以说是家常便饭,这些都离不开MCU最常用的外设,ADC,它可以将模拟量转换为数字量, ...

  8. 小壁虎EFM32之ADC 采集电压

    前言 最近在学习小壁虎EFM32芯片的使用,需要用ADC采集电压,学习之中,遇到一些小问题和需要注意的地方,现将其记录下来,避免以后自己再次踩坑和往后可以学而时习之:好了,进入正题. 代码 主函数: ...

  9. Arduino Uno 使用 ADC采集电压在LCD上显示

    Arduino Uno 使用 ADC采集电压显示在LCD上 前言 所需组件 电路图及说明 Arduino使用ADC 代码 前言 在本教程中,我们将在 ARDUINO UNO 中介绍 ADC(模数转换) ...

最新文章

  1. 我看过的数据库方面的好文章
  2. C# Lambda 和 匿名函数的GC总结
  3. 成长 | 《大厂晋升指南》学习总结(中)
  4. openerp mysql_Odoo字段(Fields)总结-至2020全
  5. 从Element ui看开发公共组件的三种方式
  6. python class类的self_Python类class参数self原理解析
  7. 有关Unity编辑器
  8. excel输出线性拟合曲线的斜率
  9. linux qt程序崩溃_Qt程式异常崩溃处理技巧(Win)
  10. 《大清重臣李鸿章·上下》—— 读后总结
  11. python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
  12. 数据库视图view简介
  13. python期货基本面分析_用python对股票期货做时序分析
  14. 苹果 CEO 库克“喜当爹”,女子为其孕育双胞胎,索赔31.6亿分手费!
  15. 基本软件开发模型:瀑布模型、V型模型、迭代模型、增量模型、螺旋模型、大爆炸模型、敏捷模型、原型模型、W模型 特点分析与总结
  16. android launcher 4x5应用排列,修改华为刷机包桌面应用图标布局排序的方法
  17. 忆联发布数据中心级NVMe SSD——UH711a以及UH711a E3.S形态
  18. 昆明计算机ppt培训机构,师友互助实操培训(昆明)ppt课件.ppt
  19. opencv的mat赋值_OpenCV Mat 类型定义和赋值
  20. 记一次我的Google电话面试经历

热门文章

  1. 用牙膏能修复手机屏幕小划痕吗?这些屏幕知识很少人知道
  2. 天地图、谷歌地图、OSM地图
  3. [云服务器实践] 将阿里云服务器的云盘数据迁移、拷贝到本地电脑
  4. 机器学习之房价预测实战
  5. 使用coding和hexo快速搭建博客
  6. Windows应用技巧___Desktop 文件夹EFS加密常用解密方法
  7. R语言使用ifelse函数与for循环的结合实战
  8. (python) 输入三条边,判断是否可以成为三角形
  9. http请求头获取请求链接_我们如何设计文件请求链接
  10. java 调接口 超时处理_接口调用超时的实现原理