找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 50|回复: 0
打印 上一主题 下一主题
收起左侧

STC8G1K08A单片机ADC多通道采样数据不正确

[复制链接]
跳转到指定楼层
楼主
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)

读取打印的值,但打印的值出来时反的

读取打印的值,但打印的值出来时反的
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表