STC8H1K08 ADC获取数值始终为0
本帖最后由 fmin888 于 2023-2-22 14:03 编辑各位大师们,有没有遇到过使用STC8H1K08读取ADC数值始终为0的问题?代码基本都是STC-ISP工具里面复制的,相关代码和电路贴出来,还请大师们帮忙指点迷津!
/** ADC配置 **/
void ConfigADC(void)
{
//查询方式
P1M0 &= ~BIT0; //P10端口
P1M1 |= BIT0;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟
ADC_CONTR = 0x80; //使能ADC模块
/*
//中断方式
P1M0 &= ~BIT0; //P10端口
P1M1 |= BIT0;
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADC_CONTR = 0x80; //使能ADC模块
EADC = 1; //使能ADC中断
EA = 1;
ADC_CONTR |= 0x40; //启动AD转换
MotorAdcIntFlag= 0;
*/
}
volatileunsigned charMotorAdc= 0;
volatilebitMotorAdcIntFlag= 0;
void ADC_Isr() interrupt 5
{
ADC_CONTR &= ~0x20; //清中断标志
MotorAdc = ADC_RES; //读取ADC结果
ADC_CONTR |= 0x40; //继续AD转换
MotorAdcIntFlag= 1;
}
/** 查询ADC值
**
*******************************************************************/
unsigned char GetAdc(void)
{
ADC_CONTR |= 0x40; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
ADC_CONTR &= ~0x20; //清完成标志
MotorAdc = ADC_RES; //读取ADC结果
}
/** 串口中断
*********************************************************************/
unsigned charRxBuff;
unsigned charbusy;
void UartIsr() interrupt 4
{
if (TI)
{//发送
TI = 0;
busy = 0;
}
if (RI)
{//接收
RI = 0;
RxBuff = SBUF;
}
}
/** 配置串口
********************************************************************/
void ConfigUart(void)
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
busy = 0;
ES = 1;
EA = 1;
}
/** 通过串口发送1byte数据
*************************************************************/
void Uart1Send(u8 dat)
{
while (busy);
_nop_();
_nop_();
busy = 1;
SBUF = dat;
}
voidmain(void)
{
P1M0= 0x00;
P1M1= 0x00;
P3M0= 0x00;
P3M1= 0x00;
P5M0= 0x00;
P5M1= 0x00;
MOTOR_CTRL= 1;
BUZZER= 0;
MotorStop();
P3M0 |= (BIT6+BIT7);
P3M1 |= BIT5;
//TimeConfig();
ConfigUart();
ConfigADC();
while(1)
{
MotorAdc= GetAdc();
//if (MotorAdcIntFlag)
{
MotorAdcIntFlag= 0;
Uart1Send(MotorAdc);
DelayMs(100);
}
}
}
更正一下,main()调用 MotorAdc= GetMotorAdc(); 实际是调用了GetAdc();
在实际电路上,我已在MOT_ADC(P10端口)加了3.2V电压,通过串口打印ADC转换结果一直是00 使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行
手边有现成的硬件,不过我的ADC是P1.1端口,看着用咯
从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查一下有没有虚焊。 kksk 发表于 2023-2-22 14:31
使用8h4k64tl测试,串口输出固定为0x64,注意到GetADC没有return语句,按图修改后能正常运行
这段是有点问题,没有return语句,因为当时准备使用ADC中断直接使用全局变量,后来改查询方式没有注意到:loveliness: 但我按图修改了查询函数还是只能返回00:L 电子DIY小家 发表于 2023-2-22 15:04
手边有现成的硬件,不过我的ADC是P1.1端口,看着用咯
我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?
乘风飞扬 发表于 2023-2-22 15:48
从图纸看ADC_Vref脚是连接到VCC了,程序排查没问题情况下读取AD值都是0,很大可能是ADC_Vref脚没接好,检查 ...
ADC_Vref有连接到VCC,我测过电压了,芯片也换过了 fmin888 发表于 2023-2-22 18:10
我把ADC端口修改为P10,还是只能打印00,你用的硬件也是STC8H1K08吗?
对的,刚刚好是STC8H1K08 问题找到了,是我串口硬件上复用了其它功能,没注意TX线上有一个小电容的问题,硬件上的问题:L,感谢各位支持,谢谢了!
页:
[1]