梁工 发表于 2023-5-11 15:14:53

开天斧3.1版-P1.7采样直流电压-50Hz交流电压计算有效值-串口1返回虚拟数码管显示

开天斧3.1版-P1.7/ADC7 采样直流电压-50Hz交流电压计算有效值-串口1(P3.1)返回虚拟数码管显示

本程序演示使用开天斧三.1的P1.7做12位ADC输入测量直流电压或50Hz正弦波电压有效值,通过串口1(P3.1)发送给上位机,波特率115200,8,n,1.
用户请先别修改程序, 直接将"ADC.hex"下载到开天斧3.1板子测试.

下载时选择主频24MHZ. 测试时, 电脑的串口助手设置115200,8,n,1.

打开串口助手开始接收, 再打开"STC调试助手"中的"7段数码管"即可看到结果.

测量交流AC电压时:
上电后默认测量交流电压有效值, 显示 AC xx.xx
如果当前显示DC, 则按一下P3.4, 显示AC xx.xx
J6(示波器输入信号AC\DC选择)开路, 交流耦合.
将J5输入对地短路, 看显示是否为0, 不为0则按下P3.5按键归0.
然后从J5输入50Hz交流电压, 将会显示电压有效值, 输入范围为0~8.5V AC, 超过则显示 AC EEEE

测量直流DC电压时:
如果当前显示AC, 则按一下P3.4, 显示DC xx.xx
J6(示波器输入信号AC\DC选择)用短路片(跳线帽)短路, 直流耦合.
将J5输入对地短路, 看显示是否为0, 不为0则按下P3.5按键归0.
然后从J5输入直流电压, 将会显示+-直流电压值, 输入范围为-11~13.5V DC, 超过则显示 DC EEEE 或 DC -EEEE.















405616736 发表于 2023-5-24 06:22:46

还是没看懂读取负电压的原理

32位8051 发表于 2023-5-24 08:48:07

405616736 发表于 2023-5-24 06:22
还是没看懂读取负电压的原理

可以结合手册看下呢


梁工 发表于 2023-5-24 11:09:11

405616736 发表于 2023-5-24 06:22
还是没看懂读取负电压的原理

请参考屠龙刀、开天斧的示波器输入电路,ADC参考电压是Vref,输入是以Vref/2为0点参考,ADC读数为2048就是0点,高于2048就是正,低于就是负。


405616736 发表于 2023-5-24 16:19:57

本帖最后由 405616736 于 2023-5-24 20:45 编辑

STC32位8051芯片 发表于 2023-5-24 08:48
可以结合手册看下呢
谢谢,之前没留意手册的电路图,现在搞明白了

405616736 发表于 2023-5-24 16:20:12

梁工 发表于 2023-5-24 11:09
请参考屠龙刀、开天斧的示波器输入电路,ADC参考电压是Vref,输入是以Vref/2为0点参考,ADC读数为2048就 ...

谢谢,我再看看手册研究一下

405616736 发表于 2023-5-25 14:48:24

梁工 发表于 2023-5-24 11:09
请参考屠龙刀、开天斧的示波器输入电路,ADC参考电压是Vref,输入是以Vref/2为0点参考,ADC读数为2048就 ...

梁工,再请教一下两个问题:
1、adc_avr = (u16)((float)adc_avr * 0.621118f);        //校准,根据具体电路参数确定。
该程序中0.621118f这个参数是否根据电路中分压公式计算出来的?

2、该程序定时器设置是否根据50Hz来设置采用周期的?
Timer0_Config(0, MAIN_Fosc / 8000);        //t=0: reload值是主时钟周期数,(中断频率)
u8        Timer0_Config(u8 t, u32 reload)        //t=0: reload值是主时钟周期数,t=1: reload值是时间(单位us)
{
        TR0 = 0;        //停止计数

        if(t != 0)        reload = (u32)(((float)MAIN_Fosc * (float)reload)/1000000UL);        //重装的是时间(us), 计算所需要的系统时钟数.
        if(reload >= (65536UL * 12))        return 1;        //值过大, 返回错误
        if(reload < 65536UL)        AUXR |= 0x80;                //1T mode
        else
        {
                AUXR &= ~0x80;        //12T mode
                reload = reload / 12;
        }
        reload = 65536UL - reload;
        TH0 = (u8)(reload >> 8);
        TL0 = (u8)(reload);

        ET0 = 1;        //允许中断
        PT0 = 1;        //高优先级中断
        TMOD = (TMOD & ~0x03) | 0;        //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
        TR0 = 1;        //开始运行
        return 0;
}

梁工 发表于 2023-5-25 15:18:33

405616736 发表于 2023-5-25 14:48
梁工,再请教一下两个问题:
1、adc_avr = (u16)((float)adc_avr * 0.621118f);        //校准,根据具体电路参 ...

1、校准系数,比如实际电压为10V,显示电压为12V,则校准系数=10/12=0.83333。
2、我国市电频率50Hz,周期20ms,采样按N个周期时间为窗口,采样频率为8000Hz,则20ms对应160个采样,采样次数就是160的正数倍(即20ms的整数倍对应的采样数)。12位ADC采样交流电压的绝对值是11位,平方值是22位,u32类型是32位,则最多可以有1024个采样,由于要160的倍数,所以采样800次,对应100ms。

405616736 发表于 2023-5-25 18:07:19

梁工 发表于 2023-5-25 15:18
1、校准系数,比如实际电压为10V,显示电压为12V,则校准系数=10/12=0.83333。
2、我国市电频率50Hz,周 ...

非常感谢解释,现软硬件的原理都完全明白了

mzh00 发表于 2023-7-16 15:53:53

这个程序移植到屠龙刀三,发现串口不工作。
页: [1] 2 3
查看完整版本: 开天斧3.1版-P1.7采样直流电压-50Hz交流电压计算有效值-串口1返回虚拟数码管显示