STC8H8K64U 加载STC8_MDU16_V1.0.LIB 导致ADC转换值出现偏差
void Pm_init(){
char i;
P3_MODE_OUT_PP(GPIO_Pin_4); // P52:电源控制;
P4_MODE_IO_PU(GPIO_Pin_2);// LED电源控制;
// P5_MODE_IO_PU(GPIO_Pin_2); // P52:电源控制;
P5_MODE_IN_HIZ(GPIO_Pin_4); // P54:ADC_CH2;
GPIO_EXTERN_PWND = 1;
GPIO_LED_PWND = 0;
EADC = 0;
ADCTIM = 0x3f; // 设置ADC内部时序
ADCEXCFG = 0x07;
ADCCFG = 0x0f; // 设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0;
delay_ms(5);
ADC_CONTR = ADC_POWER;
delay_ms(5);
ADC_CONTR |= ADC_CH15; // 使能ADC模块
for (i = 0; i < 5; i++) {
PowerManagement_McuVcc = (256L * CHIP_BGV / Pm_ReadADC()) / 10;
if (labs(PowerManagement_McuVcc - LDO_OUT) < 20) {
break;
}
};
ADC_CONTR = ADC_POWER | ADC_CH2 | ADC_EPWMT;
PowerManagement_BatAD= Pm_ReadADC();
PowerManagement_BatVcc = (uint32_t)PowerManagement_McuVcc * PowerManagement_BatAD * (BAT_R39 + BAT_R40) / (BAT_R40 * 256);
// 电量检测 2秒刷新一次
EADC = 1;
PWMA_PSCR = PWM_PRESCALER;
PWMA_CR2= 0x20; // 更新事件为TRGO,可用于触发ADC
PWMA_ARR= PWM_RELOAD;
// PWMA_IER= 0x01;
PWMA_CR1 = 0x01; // 设置CEN启动PWMA定时器,实时触发ADC
}
void ADC_ISR_Handler(void) interrupt ADC_VECTOR
{
ADC_CONTR &= ~ADC_FLAG; // 清中断标志
PowerManagement_BatAD= ADC_RES; // 读取ADC结果
PowerManagement_BatVcc = (uint32_t)PowerManagement_McuVcc * PowerManagement_BatAD * (BAT_R39 + BAT_R40) / (BAT_R40 * 256);
}
加载STC8_MDU16_V1.0.LIB编译运行,ADC转换结果是正常的,值为156,转换电压6.16V;
不加载STC8_MDU16_V1.0.LIB编译运行,ADC转换结果偏低且不稳定,AD值为116左右,转换电压在4.5V左右。不知道是什么原因...
不应该把?ADC模块是独立外设,MDU16是一个计算单元,不相关的啊。 整个工程,咋也没改,就是带不带MDU16的区别差别;我目前手上三块板子,运行不带MDU16的编译的固件,两块转换结果不准;只要换上带MDU16的固件就好了。我也想不通...
芯片版本从哪看?会不会是芯片版本不一样? fqmc020525 发表于 2024-9-5 14:12
整个工程,咋也没改,就是带不带MDU16的区别差别;我目前手上三块板子,运行不带MDU16的编译的固件,两块转 ...
我总的4块板子;一块开发板样品,我是从微信芯安商铺上购买的芯片;后面三块是客户试产的,具体从哪个渠道采购的目前我也不清楚。 梁工 发表于 2024-9-5 11:28
不应该把?ADC模块是独立外设,MDU16是一个计算单元,不相关的啊。
代码整理下,可以了,现在加不加载都一样;
uint8_t Pm_ReadADC(uint8_t nAdcCH)
{
ADC_CONTR = (ADC_CONTR & 0xf0) | ADC_START | nAdcCH;
_nop_();
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); // 查询ADC完成标志
ADC_CONTR &= ~ADC_FLAG; // 清完成标志
return ADC_RES;
}
void Pm_init()
{
char i;
P5_MODE_IN_HIZ(GPIO_Pin_4); // P54:ADC_CH2;
EADC = 0;
ADCTIM = 0x3f; // 设置ADC内部时序
ADCEXCFG= 0x07;
ADCCFG = 0x0f; // 设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80;
for (i = 0; i < 5; i++) {
PowerManagement_McuVcc = (256L * CHIP_BGV / Pm_ReadADC(ADC_CH15)) / 10;
if (labs(PowerManagement_McuVcc - LDO_OUT) < 20) {
break;
}
};
PowerManagement_BatAD= Pm_ReadADC(ADC_CH2);
PowerManagement_BatVcc = (uint32_t)PowerManagement_McuVcc *
PowerManagement_BatAD * (BAT_R39 + BAT_R40) / (BAT_R40 * 256);
ADC_CONTR = ADC_POWER | ADC_CH2 | ADC_EPWMT;
// 电量检测 2秒刷新一次
EADC = 1;
PWMA_PSCR = PWM_PRESCALER;
PWMA_CR2= 0x20; // 更新事件为TRGO,可用于触发ADC
PWMA_ARR= PWM_RELOAD;
// PWMA_IER= 0x01;
PWMA_CR1 = 0x01; // 设置CEN启动PWMA定时器,实时触发ADC
}
页:
[1]