求助!STC8G1K08芯片AD采样过程中有突然跳变的数值
问题内容:我检测市电波形,通过电压互感器转换成低电压,然后通过芯片采集数据,大概需要每周期采集100次,然后我测试单通道采集AD值,因为市电是个正弦波,我只检测正点压,负电不考虑,然后就出现了一种情况,就是正弦波偶尔测出来的波形如下图1所示。突然变成0了,我用示波器测了输入端波形,正常的。图1
AD设置如下:官方例程改的
void ADC_Init()
{
ADC_InitTypeDef ADC_InitStructure; //结构定义
// 1+2+11+10 = 2424MHz/(2*24) = 500kHz 0.000002秒一次
ADC_InitStructure.ADC_SMPduty = 15; //ADC 模拟信号采样时间控制, 0~31(注意: SMPDUTY 一定不能设置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道选择时间控制 0(默认),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道选择保持时间控制 0,1(默认),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //设置 ADC 工作时钟频率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_Power = DISABLE; //ADC功率允许/关闭 ENABLE,DISABLE
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;//ADC结果调整,ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_InitStructure.ADC_Priority= Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
ADC_InitStructure.ADC_Interrupt = DISABLE; //中断允许ENABLE,DISABLE
ADC_Inilize(&ADC_InitStructure); //初始化
// ADC电源打开1ms内不允许测量(有波动),如果测量,那么测量出来的结果也大概率是不准的
ADC_PowerControl(ENABLE); //单独的ADC电源操作函数, ENABLE或DISABLE
}
没有中断,没有定时器,就1个串口1不断发送信号给PC
串口设置如下:只发送,不接收数据
// 串口1初始化
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2, 所以不用选择)
COMx_InitStructure.UART_BaudRate= baudrate; //波特率, 110 ~ 115200
COMx_InitStructure.UART_RxEnable= ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
COMx_InitStructure.UART_Priority= Priority_0; //指定中断优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART2_SW_P10_P11,UART2_SW_P46_P47
UART_Configuration(UART1, &COMx_InitStructure); //初始化串口2 USART1,USART2,USART3,USART4
采集AD单通道:
void GetADValue_Cycle(u16* array)
{
unsigned char i = 0;
for (i = 0; i<200; i++)
{
EA = 0;
array = Get_ADCResult(ADChannel_Set);
EA = 1;
delay_10us(20);
}
}
每隔100ms发送一次数据,就是上图的波形参数,然后有些波形正常,有些波形就如图1所示,有一个值跳变成0。我调节过设置参数,增大采样时间,但是都没有效果,甚至效果更差。
有人遇到过类似的问题吗?
你把你原理图的PDF发上来,明天上班时间我请梁工学习下您的原理图 题外话,负电压如何测量:
我用STC的ADC做波形显示,没有遇到过读到0的,很想拿到一个能读到0的样片。 神农鼎 发表于 2023-1-30 19:10
你把你原理图的PDF发上来,明天上班时间我请梁工学习下您的原理图
就直接接了个10k的限流电阻接到IO上,电阻上的波形用示波器测量都是正常的,芯片检测的数值也是正常的,就是不知道是我程序设置的问题还是哪里导致的,偶尔会跳变,有时候没有变成0,但是也是突然变得很小。 梁工 发表于 2023-1-30 21:41
我用STC的ADC做波形显示,没有遇到过读到0的,很想拿到一个能读到0的样片。 ...
感觉不像是芯片的问题,因为我换了个芯片也还是存在这样的现象。 梁工 发表于 2023-1-30 21:41
我用STC的ADC做波形显示,没有遇到过读到0的,很想拿到一个能读到0的样片。 ...
程序我也是用官方例程里面的多通道ADC串口2发送的程序,把串口2发送改成串口1发送,其他的就没有了 还是要看下你的原理图的PDF,另外输入信号通道串的10K 电阻太大,改成100欧 神农鼎 发表于 2023-1-31 13:29
还是要看下你的原理图的PDF,另外输入信号通道串的10K 电阻太大,改成100欧
原理图其实很简单的,就是一个3.3V供电芯片,然后一个几个隔离用的互感器,输出的电压直接通过10k电阻接到IO上,没有上拉电阻,然后还有一个LED灯,没了。另外10K的电阻应该不影响测量吧。。。。除了这个跳变的现象,正压测量出来的结果倒是能接收的。负压直接为0。 上原理图的PDF,否则我没法请梁工学习您有问题的系统,再给出参考解决方案