ARM技术论坛
直播中

kkhkbb

6年用户 48经验值
私信 关注
[资料]

【零基础学习STM32】第九讲:ADC实验——电源监控

本帖最后由 kkhkbb 于 2018-3-19 09:01 编辑

一、概述
     ADC简介
     ADCA/D转换部件,单片机不能直接处理模拟量,所以需要ADC将模拟量转换为数字量后,在进行处理。在使用单片机进行模拟数据处理的过程中,ADC至关重要。ADC以下几种类型:
  • 积分型:积分型AD工作原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。
  • 逐次比较型:逐次比较型AD由一个比较器和DA转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置DA转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。
  • 并行比较型/串并行比较型:并行比较型AD采用多个比较器,仅作一次比较而实行转换,又称FLash(快速)型。
  • Σ-Δ(Sigma delta)调制型:Σ-ΔAD由积分器、比较器、1DA转换器和数字滤波器等组成。
  • 电容阵列逐次比较型:电容阵列逐次比较型AD在内置DA转换器中采用电容矩阵方式,也可称为电荷再分配型。
  • 压频变换型:压频变换型(Voltage-Frequency Converter)是通过间接转换方式实现模数转换的。
二、硬件电路

9_0 ARM 电源监测ADC使用图
     在iCore3双核心开发板中,使用了个ADC进行电源监控分配如下表所示:
ADC选用
   监测内容
ADC1-14通道 5V电压
ADC1-15通道 输入电流
ADC3-15通道 1.2V电压
ADC3-4通道 3.3V电压
ADC3-5通道 2.5V电压
9_0 ARM 电源监测ADC使用分配表
三、实验原理
      使用ADC5个通道,分别监测5种电源信息,使用程序进行相应的转换后,使用putty串口工具将采集到电源信息打印到PC机屏幕上,了解开发板的电源状态。
    电压监控硬件连接示意图:

                    图9_1电压监测硬件连接图
     由上图可知:VCC =(1 + R1 / R2)*ADC_IN;
     故知:VCC = (1 + 49.9K / 10K)*ADC_IN = 6*ADC_IN;
     其他电源监控同理可得:D3V3 = 2*ADC_IN;
                                        A2V5 =2*ADC_IN;
                                        D1V2 =ADC_IN
     电流监控硬件连接示意图如下图

        图9_2电流监测硬件连接图
    由 ZXCT1009F 的原理可知:ADC_IN = 0.01 * (VCC - LOAD)*R2;
    通过 R1 的电流:I = 100 *ADC_IN /R2 /R1;
    带入 R2 = 10K,R1 = 0.02:得出:I =ADC_IN / 2;
四、源代码
主函数
//--------------------------- Include ---------------------------//
#include "..includeled.h"
#include "..includemain.h"
#include "..includeusart.h"
#include "..includeadc.h"
#include "..fwlibincSTM32f4xx_gpio.h"

//---------------------------- Define ---------------------------//

//-------------------------- Variable ---------------------------//

//--------------------- Function Prototype ----------------------//

//--------------------------- Function --------------------------//
/*
* Name                : main
* Description         : ---
* Author              : ysloveivy.
*
* History
* --------------------
* Rev                 : 0.00
* Date                : 11/21/2015
*
* create.
* --------------------
*/
int main(void)
{
        int i;

        //初始化
        led.initialize();
        LED_RED_ON;
        usart4.initialize(115200);
        adc.initialize();

        usart4.printf("x0c");                                   //清屏

        usart4.printf("33[1;32;40m");                  //设置终端字体为绿色

        usart4.printf("rnrnhello! I am iCore3!rnrnrn");
        while(1){
                for(i = 0;i < 10000000;i++);

                //ADC 监控电源
                for(i = 0;i < 5;i++){
                        adc.read(i);
                }
                //打印系统供电电压,
                usart4.printf(" [V] %4.2fV, ",adc.value[0] * 6);
                usart4.printf("[I] %3.0fmA , ",adc.value[1] / 2* 1000.);
                usart4.printf("[1.2V] %4.2fV, ",adc.value[2]);
                usart4.printf("[3.3V] %4.2fV, ",adc.value[3] * 2);
                usart4.printf("[2.5V] %4.2fVr",adc.value[4] * 2);
        }
}
五、实验现象
      iCore3 双核心板红色 LED 常亮, 串口一直向终端输出电源监控的数据。
                  图9_3实验效果图
六、代码包下载
       网盘:http://pan.baidu.com/s/1o7wSEO6

更多回帖

发帖
×
20
完善资料,
赚取积分