一.参考电压
VDD接入电压为3.3V
注意: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;
void Driver_Adc_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(ADC_GPIO_CLK,ENABLE);
GPIO_InitStructure.GPIO_Pin = ADC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(ADC_PORT, &GPIO_InitStructure);
}
void Driver_ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStruct;
RCC_APB2PeriphClockCmd ( ADC_CLK, ENABLE );
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
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;
ADC_Init(ADC_x,&ADC_InitStruct);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
ADC_RegularChannelConfig(ADC_x, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
ADC_ITConfig(ADC_x, ADC_IT_EOC, ENABLE);
}
void Driver_ADC_Cmd_ENABLE(void)
{
ADC_Cmd(ADC_x,ENABLE);
}
void Driver_ADC_Cmd_DISABLE(void)
{
ADC_Cmd(ADC_x,DISABLE);
}
void Driver_ADC_Calibration(void)
{
ADC_ResetCalibration(ADC_x);
while(ADC_GetResetCalibrationStatus(ADC_x));
ADC_StartCalibration(ADC_x);
while(ADC_GetCalibrationStatus(ADC_x));
ADC_SoftwareStartConvCmd(ADC_x, ENABLE);
}
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);
}
void ADC_IRQHandler(void)
{
if (ADC_GetITStatus(ADC_x,ADC_IT_EOC)==SET)
{
ADC_ConvertedValue = ADC_GetConversionValue(ADC_x);
}
ADC_ClearITPendingBit(ADC_x,ADC_IT_EOC);
}
void ADCx_Init(void)
{
Driver_Adc_GPIO_Init();
Driver_ADC_Config();
Driver_ADC_Cmd_ENABLE();
Driver_ADC_Calibration();
ADC_NVIC_Config();
}
|