电路分析
- 串联分压,并联分流,所以P01的电压并不是这条线的总电压,应乘3
编程思路
- 需要用到ADC(模拟信号转数字信号),初始化GPIO_P0引脚和ADC配置
- 电压计算公式:调用Get_ADCResult可得出结果,公式为Vol=result*2.5/4096
代码示例
Battery.h
#ifndef __BATTERY_H
#define __BATTERY_H
#include "GPIO.h"
#define VOL_PIN P01
void VOL_GPIO_init();
void VOL_ADC_init();
void Get_Voltage(float *voltage);
#endif
Battery.c
#include "Battery.h"
#include "ADC.h"
#include "NVIC.h"
void VOL_GPIO_init(void) {
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_1; //指定要初始化的IO,
GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P0, &GPIO_InitStructure);//初始化
}
void VOL_ADC_init(){
ADC_InitTypeDef init;
init.ADC_SMPduty=31; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
init.ADC_Speed=ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
init.ADC_AdjResult=ADC_RIGHT_JUSTIFIED; //ADC结果调整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
init.ADC_CsSetup=0; //ADC 通道选择时间控制 0(默认),1
init.ADC_CsHold=1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_Inilize(&init);
ADC_PowerControl(ENABLE); //ADC电源开关:ENABLE,DISABLE
NVIC_ADC_Init(DISABLE, Priority_1);
}
void Get_Voltage(float * voltage){
u16 result;
result = Get_ADCResult(ADC_CH9);
* voltage=(result*2.5/4096)*3;
}
main.c
#include "RTX51TNY.h"
#include "GPIO.h"
#include "NVIC.h"
#include "UART.h"
#include "Switch.h"
#include "LED.h"
#include "Key.h"
#include "Battery.h"
#define TASK_MAIN 0
#define TASK_LED 1
#define TASK_KEY 2
#define TASK_VOLTAGE 3
void task_voltage() _task_ TASK_VOLTAGE{
float vol;
while(1){
Get_Voltage(&vol);
printf("vol %.2f",vol);
os_wait2(K_TMO, 200);
}
}
void task_main() _task_ TASK_MAIN{
EA=1;
//LED_init();
UART_config();
VOL_GPIO_init();
VOL_ADC_init();
// os_create_task(TASK_LED);
//os_create_task(TASK_KEY);
os_create_task(TASK_VOLTAGE);
os_delete_task(0);
}