STC8H3K64S4的ADC采样时出现引脚有0.2v的锯齿波
本帖最后由 Sany_186 于 2023-9-23 08:28 编辑STC8H3K64S4的ADC采样时出现引脚有0.2v的锯齿波
1. 放大输出通过一个10K 连接到 STC8H3K64S4 单片机 P12引脚,ADC 02通道,P02引脚在采样时有0.2v的锯齿波,10K电阻另一端电压为0v,无波形。已确认是单片机自身输出的杂波,更换全新单片机也是一样。
以下是代码段:
/*ADC控制寄存器:Define ADC operation const for ADC_CONTR,ADC_CHS B3 - B0*/
#define ADC_POWER 0x80 //ADC power control bit
#define ADC_FLAG 0x20 //ADC complete flag
#define ADC_START 0x40 //ADC start control bit
#define ADC_EPWMT 0x10
/*----------------------------
Initial ADC sfr
----------------------------*/
void InitADC()
{
P_SW2 |= 0x80;
ADCTIM = 0x3f; //设置ADC内部时序
P_SW2 &= 0x7f;
ADCCFG = 0x0f; //设置ADC时钟为系统时钟/2/16
ADCCFG |= 0x20; //设置ADC转换结果右对齐
ADC_CONTR = 0x80; //使能ADC模块
}
/*----------------------------
Get ADC result
----------------------------*/
uchar ReadADCValue(uchar Uc_ch)
{
ADC_CONTR &= 0xf0; //清0 ADC通道
ADC_CONTR |= Uc_ch;
ADC_CONTR |= ADC_START; //启动AD转换
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //查询ADC完成标志
ADC_CONTR &= ~ADC_FLAG; //清完成标志
returnADC_RES; //读取ADC结果
}
/*----------------------------
Get ADC result
----------------------------*/
unsigned char GetAdcValue()
{
static unsigned char Count = 0;
unsigned char AdcData_H = 0;
unsigned char AdcData_L = 0;
bit B_ConvertFlag = 0;
if (Count < 50)
{
Count++;
AdcData_H = ReadADCValue(Uc_ch);
AdcData_L = ADC_RESL;
}
else
{
B_ConvertFlag = 1;
}
return B_ConvertFlag;
}
// 主程序执行
void main()
{
//初始化
P1M0 = 0x03; P1M1 = 0xc4;
InitADC();
while(1)
{
while(GetADCValue != 1);
}
}
///////////////////////////////////////以下是波形图和硬件原理图//////////////////////////////////////////
硬件
u
原理图
【新提醒】真12位ADC的STC8H3K64S2制作的双路电压电流表LCD12864 - ADC/比较器,DMA支持的12位ADC,轨到轨比较器,DAC - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
本帖最后由 Sany_186 于 2023-9-23 10:05 编辑
按上面改一下设计,再看吧
可以先了解一下ADC原理(我以前的讲课视频有说明)。
STC MCU的ADC是输入无缓冲直接采样的(这样可以避免缓冲电路造成严重的0点误差),采样时需要给采样电容(16~20pF)充放电,你讲信号串联10K电阻,你看到的就是充放电波形。
你应该在ADC输入口对地接一个100nF(又叫0.1uF、104)的电容,就可以了。L4与C38去掉不接。 梁工 发表于 2023-9-23 13:36
可以先了解一下ADC原理(我以前的讲课视频有说明)。
STC MCU的ADC是输入无缓冲直接采样的(这样可以避免缓 ...
好的
梁工让你 L4 直接0欧短路, R26直接0欧短路,保留 C38
神农鼎 发表于 2023-9-23 15:06
梁工让你 L4 直接0欧短路, R26直接0欧短路,保留 C38
好的,晚上试一下,谢谢了 本帖最后由 梁工 于 2023-9-23 19:14 编辑
神农鼎 发表于 2023-9-23 15:06
梁工让你 L4 直接0欧短路, R26直接0欧短路,保留 C38
R26不能短路。
因为运放有负电压,所以R26要保留,改成1K即可。
梁工 发表于 2023-9-23 19:09
R26不能短路。
因为运放有负电压,所以R26要保留,改成1K即可。
1. 还是不行,程序注释掉,就剩下ADC部分,一启动转换ADC引脚输入端口就有杂波。
2. 移除其它电路供电也是一样。
3. 整个电源供电的纹波是非常小的,应该在5mv以内。
我上传了一段视频,P12引脚不接任何东西时,启动转换的波形
是不是地线布线有问题,我打算重新做一个PCB,地线都选择一点接地,ADC供电部分改回PDF的参考电路,ADC参考电压为4096mV
页:
[1]