|
|
STC8G1K08A
ADC 多通道 进行采样时,获取到得数据与实际不一致,单通道时是对的
#include "config.h"
#include "STC8G_H_GPIO.h"
#include "STC8G_H_Timer.h"
#include "STC8G_H_ADC.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_Delay.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_Switch.h"
//==================== 硬件引脚定义 ====================
sbit CHONG = P3^3; // 充电控制(0=开启充电,1=关闭充电)
sbit FANG = P3^2; // 放电控制(0=开启放电,1=关闭放电)
//==================== ADC 通道定义 ====================
#define ADC_CH_BAT 4 // P5.4 电池电压 → 通道4
#define ADC_CH_POWER 5 // P5.5 外部电源检测 → 通道5
//==================== 阈值参数 ====================
#define BAT_MAX 651 // 电池≥651 → 关充电 P3.2=1
#define BAT_MIN 512 // 电池≤512 → 关放电 P3.3=1
//==================== 全局变量 ====================
volatile u16 bat_adc = 0; // 电池电压ADC
volatile u16 pwr_adc = 0; // 电源检测ADC
volatile u16 TIME_COUNT = 0;
volatile u16 adc_flag = 0;
//==================== IO初始化 ====================
void GPIO_CONFIG(void)
{
P3_MODE_OUT_PP(GPIO_Pin_2); // P3.2 充电控制
P3_MODE_OUT_PP(GPIO_Pin_3); // P3.3 放电控制
P5_MODE_IN_HIZ(GPIO_Pin_4); // P5.4 电池ADC输入
P5_MODE_IN_HIZ(GPIO_Pin_5); // P5.5 电源ADC输入
}
//==================== ADC初始化 ====================
void ADC_CONFIG(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_SMPduty = 31;
ADC_InitStructure.ADC_CsSetup = 0;
ADC_InitStructure.ADC_CsHold =1;
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X16T;
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;
ADC_Inilize(&ADC_InitStructure);
ADC_PowerControl(ENABLE);
}
//==================== TIMER0 1MS 中断 ====================
void TIM_CONFIG(void)
{
TIM_InitTypeDef TIM_InitStructure;
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload;
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;
TIM_InitStructure.TIM_ClkOut = DISABLE;
TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / 2400); // 1ms中断
TIM_InitStructure.TIM_Run = ENABLE;
Timer_Inilize(Timer0,&TIM_InitStructure);
NVIC_Timer0_Init(ENABLE,Priority_1);
}
void UART_CONFIG(void)
{
COMx_InitDefine COMx_InitStructure;
COMx_InitStructure.UART_Mode = UART_8bit_BRTx;
COMx_InitStructure.UART_BRT_Use = BRT_Timer1;
COMx_InitStructure.UART_BaudRate = 115200ul;
COMx_InitStructure.UART_RxEnable = DISABLE;
UART_Configuration(UART1,&COMx_InitStructure);
NVIC_UART1_Init(ENABLE,Priority_2);
UART1_SW(UART1_SW_P30_P31);
}
//==================== 主函数 ====================
void main(void)
{
EAXSFR();
GPIO_CONFIG();
ADC_CONFIG();
TIM_CONFIG();
UART_CONFIG();
EA = 1;
// // 上电默认关闭充放电
// CHONG = 1;
// FANG = 1;
while(1)
{
// ================== 有外部电源:充电模式 ==================
if(pwr_adc > 100)
{
FANG = 1; // 关闭放电
if(bat_adc < BAT_MAX)
{
CHONG = 0; // 开启充电
}
else
{
CHONG = 1; // 满电,关闭充电
}
}
// ================== 无外部电源:放电模式 ==================
else
{
CHONG = 1; // 关闭充电
if(bat_adc > BAT_MIN)
{
FANG = 0; // 开启放电
}
else
{
FANG = 1; // 欠压,关闭放电
}
}
}
}
//==================== 1MS 中断:ADC 单次采样 ====================
// 全局区新增一个切换标记
//==================== 1MS 中断 ====================
//==================== 1MS 中断:ADC 单次采样 ====================
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR
{
TF0 = 0;
if(++TIME_COUNT >=20)
{
TIME_COUNT=0;
if(adc_flag == 0)
{
// //本次只采电源
pwr_adc = Get_ADCResult(ADC_CH_POWER);
adc_flag = 1;
}
else
{
//下次只采电池
bat_adc = Get_ADCResult(ADC_CH_BAT);
adc_flag = 0;
}
//异常值修正
if(pwr_adc>=4096) pwr_adc=0;
if(bat_adc>=4096) bat_adc=0;
//打印不变
TX1_write2buff('P');
TX1_write2buff(':');
TX1_write2buff((pwr_adc / 1000) % 10 + '0');
TX1_write2buff((pwr_adc / 100) % 10 + '0');
TX1_write2buff((pwr_adc / 10) % 10 + '0');
TX1_write2buff(pwr_adc % 10 + '0');
TX1_write2buff('\r');
TX1_write2buff('\n');
TX1_write2buff('B');
TX1_write2buff(':');
TX1_write2buff((bat_adc / 1000) % 10 + '0');
TX1_write2buff((bat_adc / 100) % 10 + '0');
TX1_write2buff((bat_adc / 10) % 10 + '0');
TX1_write2buff(bat_adc % 10 + '0');
TX1_write2buff('\r');
TX1_write2buff('\n');
}
}
|
-
捕获.PNG
(14.47 KB, 下载次数: 0)
读取打印的值,但打印的值出来时反的
|