STC8H8K蓝牙智能巡线小车——4.ADC电压检测

STC8H8K蓝牙智能巡线小车——4.ADC电压检测_第1张图片
电路分析
  • 串联分压,并联分流,所以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);
}

你可能感兴趣的:(单片机开发(IC,Development),51单片机,嵌入式硬件)