IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 - ADC采集电压 中断处理 -> 正文阅读

[嵌入式]STM32 - ADC采集电压 中断处理

一.参考电压

在这里插入图片描述
VDD接入电压为3.3V

  • ADC供电要求:2.4V到3.6V

在这里插入图片描述

注意:STM32的100脚以上(含100脚)有参考电压引脚。在没有参考电压引脚的单片机上,可以把基准电压芯片接入VDDA,但是VDDA和VDD的电压差不能超过0.3V,例如,VDD是3.3V的话,可以给VDDA接入一个3.3V的参考电压芯片或者3.0V的参考电压芯片,但是不能接入2.5V的参考电压芯片,后果就是芯片不能工作

1.1 电池电压采集电路

在这里插入图片描述分电压电路进行ADC采集,进而计算出电压
比如stm32单片机,内部集成了12位ADC,其分压级数位4096级,参考电压3.3V供电的情况下,每一级的电压是 3300mV/4096=0.8mV/级,如果STM32采集到的电池电压数据是 A,假设分压比列23.2:1,则电池电压就P=A0.82,计算出来单位是mV
Vc=VCC*(R4/(R4+R3))
在这里插入图片描述

在这里插入图片描述

  • 一般我们用外部芯片供电电压为参考基准就用下面那个公式,也就是上面说的XY比例
    ADC_value =(uint32_t)(ADC_value*VOLTAGE >> ADC_DIP(12)); //换算成千倍的电压值
  • 若用内部基准电压作为参考则用以下公式
    -VDD_value = (uint32_t)((REF_VOLTAGE << ADC_DIP(12)) / VDD_value); //
    换算成千倍的电压值

代码

#include "msp_adc.h"

__IO uint16_t ADC_ConvertedValue;

//PCLK2=HCLK=72M
/*******************************************************************************
Function: Driver_Adc_GPIO_Init 
Description: adc采样端口初始化
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void Driver_Adc_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	 RCC_APB2PeriphClockCmd(ADC_GPIO_CLK,ENABLE);
    GPIO_InitStructure.GPIO_Pin = ADC_PIN;              //PA1 (Analog Input)
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;       // 必须为模拟输入
    GPIO_Init(ADC_PORT, &GPIO_InitStructure);	   
}
/***************************************************************************** 
Function: Driver_ADC_Config
Description: ADC模式配置,中断方式
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void Driver_ADC_Config(void)
{
    ADC_InitTypeDef ADC_InitStruct;	
    RCC_APB2PeriphClockCmd ( ADC_CLK, ENABLE );                                 //打开ADC时钟
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;                            	// 只使用一个ADC,属于独立模式
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;        	                        //禁止扫描模式,多通道才要,单通道不需要                   
    ADC_InitStruct.ADC_ContinuousConvMode =  ENABLE;                            //连续转换	
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;            //不用外部触发转换,软件触发
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;                         //对齐方式	,不用外部触发转换
	  ADC_InitStruct.ADC_NbrOfChannel = 1;                                        //只转换规则序列1
    ADC_Init(ADC_x,&ADC_InitStruct);	
	
    RCC_ADCCLKConfig(RCC_PCLK2_Div8);                                           // 配置ADC时钟为PCLK2的8分频,即9MHz
    ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);	// 配置 ADC 通道转换顺序和采样时间
    ADC_ITConfig(ADC_x, ADC_IT_EOC, ENABLE);                                    // ADC 转换结束产生中断,在中断服务程序中读取转换值
	
}
/*******************************************************************************
Function: Driver_ADC_Cmd_ENABLE 
Description: 内部参考电压使能
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void Driver_ADC_Cmd_ENABLE(void)
{
    ADC_Cmd(ADC_x,ENABLE);
}

/*******************************************************************************
Function: Driver_ADC_Cmd_DISABLE 
Description: 内部参考电压失能关闭
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void Driver_ADC_Cmd_DISABLE(void)
{
    ADC_Cmd(ADC_x,DISABLE);
}

/***************************************************************************** 
Function: Driver_ADC_Calibration
Description: 进行ADC校准四个步骤,减小误差
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void Driver_ADC_Calibration(void)
{   
   
    ADC_ResetCalibration(ADC_x);                 // 初始化ADC 校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC_x)); //等待复位校准完成
	  ADC_StartCalibration(ADC_x);                 // ADC开始校准
    while(ADC_GetCalibrationStatus(ADC_x));      // 等待校准完成  
	  ADC_SoftwareStartConvCmd(ADC_x, ENABLE);     // 由于没有采用外部触发,所以使用软件触发ADC转换  
}

/***************************************************************************** 
Function: ADC_NVIC_Config
Description: 进行ADC中断配置
Input:  无
Output: 无
Return: 无
*******************************************************************************/
static void ADC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
	// 优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  // 配置中断优先级
  NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
/***************************************************************************** 
Function: ADC_IRQHandler
Description: ADC中断
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void ADC_IRQHandler(void)
{	
    if (ADC_GetITStatus(ADC_x,ADC_IT_EOC)==SET) 
    {
        ADC_ConvertedValue = ADC_GetConversionValue(ADC_x);    // 读取ADC的转换值
    }
    ADC_ClearITPendingBit(ADC_x,ADC_IT_EOC);
}

///***************************************************************************** 
//Function: Driver_ADC_Getconvertedvalue
//Description: ADC转换数据获取
//Input:  无
//Output: 无
//Return: 无
//*******************************************************************************/
//float Driver_ADC_Getconvertedvalue(void)
//{
//    //float Vdd_Value = 3.3;//基准电压
//    //float ADC_ConvertedValueLocal = 0;	   
//  
//    DMA_ClearITPendingBit(DMA1_IT_TC1);
//    while(!DMA_GetITStatus(DMA1_IT_TC1));
//    DMA_ClearITPendingBit(DMA1_IT_TC1);
//    //ADC_ConvertedValueLocal = (float)ADC_ConvertedValue/4096*Vdd_Value;
//    return 0;
//}

/***************************************************************************** 
Function: ADCx_Init
Description: ADC初始化
Input:  无
Output: 无
Return: 无
*******************************************************************************/
void ADCx_Init(void)
{
    Driver_Adc_GPIO_Init();
	  Driver_ADC_Config();
	  Driver_ADC_Cmd_ENABLE();
	  Driver_ADC_Calibration();
	  ADC_NVIC_Config();
}
/****************************************END*************************************/

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:12:15  更:2022-09-24 21:14:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 1:02:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计