- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2025-06-17 09:39:01
已绑定手机
新手上路
- 积分
- 46
|
我用用STC8H1K08测量电池电压,输入电压发生变化,但读取的数据无变化.:
1.主芯片为 STC8H1K08 TSSOP 20封装
2.P1.1为 VBAT_ADC输入口
3.P3.1为RXD,P3.0为RXD
下面是代码:
void ADCInit(void)
{
Enable_XFR();
//端口数字信号输入使能控制寄存器 PxIE
//PxIE 0:禁止数字信号输入。若 I/O被当作比较器输入口、ADC 输入口或者触摸按键输入口等模拟口时,
// 进入时钟停振模式前,必须设置为 0,否则会有额外的耗电。
//PxIE 1:使能数字信号输入。若 I/O被当作数字口时,必须设置为 1,否 MCU无法读取外部端口的电平。
// P1IE &= 0xFD; //1: 使能数字信号输入,1.1作为ADC输入,置0
P1IE |= 0xFF; //1: 使能数字信号输入
P3IE |= 0x03; //,3.1/3.0作为RX/TX输入输出口
P1INTE |= 0x02; //1:使能 Pn.x 口中断功能
P1INTF &= 0xFD; //0:中断请求标志位需软件清 0
P3INTE |= 0x03; //1:使能 Pn.x 口中断功能
P3INTF &= 0xFC; //中断请求标志位需软件清 0
//--------------------------------------------------------
//--ADC时序控制寄存器
//----------------------------------------------------------------
//--| 符号 | 地址 | B7 | B6 | B5 | B4 B3 B2 B1 B0 |
//--|--------|-------|---------|-------------|--------------------|
//--| ADCTIM | FEA8H | CSSETUP | CSHOLD[1:0] | SMPDUTY[4:0] |
//----------------------------------------------------------------|
ADCTIM = 0x3D;// 0b001 1 1101; //30 设置 ADC 内部时序
Disable_XFR();
//SPEED[3:0]:设置 ADC 工作时钟频率{FADC=SYSclk/2/(SPEED+1)}
ADCCFG = 0x0F; //SYSclk/2/16
//RESFMT:ADC 转换结果格式控制位
//1:转换结果右对齐。ADC_RES 保存结果的高 2位,ADC_RESL 保存结果的低 8 位
ADCCFG |= 0x20;
//ADC控制寄存器
//-------------------------------------------------------------------------------------
//-| 符号 | 地址 | B7 | B6 | B5 | B4 | B3 B2 B1 B0 |
//-|-----------|------|-----------|-----------|----------|-----------|----------------|
//-| ADC_CONTR | BCH | ADC_POWER | ADC_START | ADC_FLAG | ADC_EPWMT | ADC_CHS[3:0] |
//-|-----------------------------------------------------------------------------------
//- ADC_FLAG:ADC转换完成中断请求标志。需要软件清零。
ADC_CONTR &= 0xDF; //ADC_FLAG:ADC转换完成中断请求标志。需要软件清零。
ADC_CONTR |= 0x01; //0001,开启P1.1 VBAT_ACD转换口
ADC_CONTR &= 0xF1;
//ADC_POWER:ADC 电源控制位
//0:关闭 ADC 电源
//1:打开 ADC 电源。
//建议进入空闲模式和掉电模式前将 ADC 电源关闭,以降低功耗
OpenPowerADC(); //1:打开 ADC 电源。
//ADC_START:ADC 转换启动控制位。写入 1 后开始 ADC 转换,转换完成后硬件自动将此位清零。
//0:无影响。即使 ADC 已经开始转换工作,写 0也不会停止 A/D转换。
//1:开始 ADC 转换,转换完成后硬件自动将此位清零。
// OpenADCStart();
//EADC:A/D转换中断允许位。
//0:禁止 A/D转换中断
//1:允许 A/D转换中断
IE |= 0x20; //1:允许 A/D转换中断
}
void ADCChange(void)
{
if(AllFlag.Flag.ADC_Change_Stop_Flag ==0)
{
ADCValue = 0;
if((ADC_CONTR & 0x0F) == 0x0F)
{
DBG_PRINTF(" -----VBAT_ACD bigan: ");
ADC_CONTR |= 0x01; //0001,开启P1.1 VBAT_ACD转换口
ADC_CONTR &= 0xF1;
}
else //if((ADC_CONTR & 0x0F) == 0x0F)
{
DBG_PRINTF("+++++ VBAT_ACD OK: ");
ADC_CONTR |= 0x0F;
// ADC_CONTR &=0xFC;
}
AllFlag.Flag.ADC_Change_Stop_Flag = 1;
ADCChargeTime = 0;
ADC_CONTR &= 0xDF; //ADC_FLAG:ADC转换完成中断请求标志 需要软件清零
OpenADCStart();
}
else if(ADCChargeTime > TimeParameter50ms) // 50ms
{
ADCChargeTime = 0;
ADC_CONTR &= 0xDF;
OpenADCStart();
}
}
void ADCChargeFunction(void)
{
unsigned char i;
// unsigned int temp=1025;
ADCChange();
if(AllFlag.Flag.ADC_Change_Finish_Flag)
{//0xEFF0 = 0x0004A3F7
// if((ADC_CONTR & 0x0F) == 0x0C)
if((ADC_CONTR & 0x0F) == 0x0F)
{//0x0C Bat VBAT
ADCBatValue[ADCValueTimes++] = ADCValue;
// ADCBatValue = ADCValue;
// LEDBatValue = ADCBatValue;
DBG_PRINTF("BAT: %d\n",ADCValue);
}
else if((ADC_CONTR & 0x0F) == 0x01)
{//0x0E Dat DC_DAT
DCDatValue = ADCValue;
DBG_PRINTF("DAT: %d\n",ADCValue);
if(DCDatValue > DC_DAT_Value)
{
AllFlag.Flag.DC_DAT_Value_Flag = 1;
AllFlag.Flag.INT3_ISR_Flag = 1;
}
else
{
AllFlag.Flag.DC_DAT_Value_Flag = 0;
AllFlag.Flag.INT3_ISR_Flag = 0;
// CloseAllLED();
}
}
if(ADCValueTimes >= sizeof(ADCBatValue)/sizeof(unsigned int))
{
// for(i=0;i<ADCValueTimes;i++)
// temp = temp <= ADCBatValue[i] ? temp : ADCBatValue[i];
for(i=0;i<(ADCValueTimes-1);i++)
{
ADCBatValue[0] += ADCBatValue[i+1];
}
// ADCBatValue[0] -=temp;
LEDBatValue = ADCBatValue[0]/ADCValueTimes;
printf("LEDBatValue :%d \n",LEDBatValue);
ADCValueTimes = 0;
}
AllFlag.Flag.ADC_Change_Finish_Flag = 0;
// DBG_PRINTF("00000AllFlag.Flag.ADC_Change_Finish_Flag =: %d\n",AllFlag.Flag.ADC_Change_Finish_Flag);
AllFlag.Flag.ADC_Change_Stop_Flag = 0;
}
}
|
|