基于STM32F103内部AD测量电池电压

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。

  • 27
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
好的,基于STM32F103进行AD采集测量电压,可以按照以下步骤进行: 1. 确定ADC口:首先,您需要确定STM32F103芯片上ADC口的引脚号。通常情况下,STM32F103芯片手册中都会有ADC口引脚的定义,您可以查阅相关资料来确定该引脚的编号。 2. 连接电压:将需要测量电压通过电阻分压或者其他方式连接到ADC口引脚,以便将电压信号转换为模拟信号。 3. 配置ADC:在进行测量前,您需要通过程序配置ADC,以便使其能够正确地读取模拟信号并将其转换为数字信号。具体配置方式如下: * 选择ADC模式:STM32F103芯片有多种ADC模式可选,您需要选择合适的模式。常见的有单次转换模式和连续转换模式。 * 选择采样周期:ADC转换需要一定的时间,您需要根据您的应用场景选择合适的采样周期。采样周期越短,采样速度越快,但是精度可能会受到影响。 * 配置转换精度:ADC可以支持不同的转换精度,通常为12位或者10位。您需要根据您的应用场景选择合适的转换精度。 4. 进行测量:完成ADC配置后,您可以通过读取ADC的数值来获取当前电压值。具体读取方式如下: * 启动ADC转换:您需要在程序中启动ADC转换,让其开始采集模拟信号。 * 等待转换完成:ADC转换需要一定的时间,您需要在程序中等待转换完成。 * 读取转换结果:ADC转换完成后,您可以通过读取ADC寄存器的数值来获取转换结果。数值范围为0-4095,代表电压范围为0-3.3V。 希望以上步骤能够对您有所帮助,如有不清楚的地方,欢迎继续提问。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺水城子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值