历史上的今天
今天是:2025年01月29日(星期三)
2019年01月29日 | 基于STM32F103内部AD测量电池电压
2019-01-29 来源:eefocus
STM32的ADC介绍:
STM32 拥有 1~3 个 ADC ( STM32F101/102系列只有1个ADC),这些ADC可以独立使用,也可以使用双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值
STM32 的 ADC 最大的转换速率为 1Mhz,也就是转换时间为 1us(在 ADCCLK=14M,采样周期 1.5 个 ADC 时钟下得到),不要让 ADC 的时钟超过 14M,否则将导致结果准确度下降
STM32 将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换,在注入通道被转换完成之后,规则通道才得以继续转换
STM32的ADC通道与GPIO对应表:

基于STM32F103内部AD测量电池电压,硬件电路如下:


根据电路,GPIO PA5作为电池电压测量端口:
1、GPIO以及ADC初始化;
void Power_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/*V_BAT*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立工作模式
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_InitStructure.ADC_NbrOfChannel =1;
ADC_Init(ADC1,&ADC_InitStructure);
ADC_Cmd(ADC1,ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
}
2、获取ADC值,转化成电池电压值
//获取某个通道的ADC值
float Get_Adc(BYTE ch)
{
uint16_t adc;
float Vbat;
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
//将通道5的值计算电池电压值
float Power_Get_VBAT(void)
{
float adc;
adc = Get_Adc(5);
adc = adc + Get_Adc(5);
adc = adc + Get_Adc(5);
adc = adc + Get_Adc(5);
adc = adc / 4;
g_VBat = (adc * 2) * 3.3 / 4096 ;//电阻1/2分压
return g_VBat;
}
注:使用PA5作为电压值采集端口,根据上表,ADC采样通道为通道5。
史海拾趣
|
大家请看下面的程序: void Show_BMP(unsigned int Width,unsigned int Height) { unsigned long int position; position=0x4d200+0x3e+Width/7+Height*408; ... ... } 以上程序的写法绝对没有任何语法错误!!Code ...… 查看全部问答> |
|
开机检测,不是充电电路问题,该机采用ATJ2085方案,可以充电,但是开机后,立马显示电池电量低,电池电压正常,检查ATJ2085的第31脚,电量检测脚,发现所连接的两个电阻有一个虚焊,加焊后,检测OK。 准备装机,装好后,结果还是开不 ...… 查看全部问答> |
|
wince 下我要用AM85C30实现同步通信(SDLC),问题是这个芯片接收FIFO 3字节,发送没有缓冲! 比如我要用1Mbps通信,中断频率就要1M/8=125k/s, 接收的状况要好一些,3字节的FIFO可以把中断频率降到125k/3=42k/s, 发送就更郁闷了,完全是125k/s ...… 查看全部问答> |
|
版主: 您好,使用STM32F有一段时间了,感觉STM32的性价比较高,最近在了解使用FSMC驱动rgb接口的相关内容,在ST官方网站上下载了与之相关的AN3241文档,看到有个基于STM3210E-EVAL的demo板的支持直接驱动TFT液晶的函数库,我 ...… 查看全部问答> |




