找回密码
 立即注册
查看: 1388|回复: 23

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

[复制链接]

该用户从未签到

46

主题

2927

回帖

6585

积分

超级版主

积分
6585
发表于 2023-5-11 15:14:53 | 显示全部楼层 |阅读模式
开天斧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.


输入接线.JPG

数码管虚拟显示设置.JPG

交流电压显示效果.JPG

直流正电压显示效果.JPG

直流负电压显示效果.JPG

11-开天斧3.1-P1.7采样直流电压-50Hz交流电压计算有效值-串口1(P3.1)返回虚拟数码管显示.rar (368.33 KB, 下载次数: 117)


回复 送花

使用道具 举报

  • TA的每日心情
    开心
    2023-12-8 18:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    15

    回帖

    829

    积分

    高级会员

    积分
    829
    发表于 2023-5-24 06:22:46 | 显示全部楼层
    还是没看懂读取负电压的原理

    点评

    请参考屠龙刀、开天斧的示波器输入电路,ADC参考电压是Vref,输入是以Vref/2为0点参考,ADC读数为2048就是0点,高于2048就是正,低于就是负。  详情 回复 发表于 2023-5-24 11:09
    可以结合手册看下呢  详情 回复 发表于 2023-5-24 08:48
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 40 天

    [LV.5]常住居民I

    5

    主题

    112

    回帖

    1084

    积分

    版主

    积分
    1084
    发表于 2023-5-24 08:48:07 | 显示全部楼层
    405616736 发表于 2023-5-24 06:22
    还是没看懂读取负电压的原理

    可以结合手册看下呢
    1.png

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2927

    回帖

    6585

    积分

    超级版主

    积分
    6585
     楼主| 发表于 2023-5-24 11:09:11 | 显示全部楼层
    405616736 发表于 2023-5-24 06:22
    还是没看懂读取负电压的原理

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-8 18:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    15

    回帖

    829

    积分

    高级会员

    积分
    829
    发表于 2023-5-24 16:19:57 | 显示全部楼层
    本帖最后由 405616736 于 2023-5-24 20:45 编辑

    谢谢,之前没留意手册的电路图,现在搞明白了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-8 18:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    15

    回帖

    829

    积分

    高级会员

    积分
    829
    发表于 2023-5-24 16:20:12 | 显示全部楼层
    梁工 发表于 2023-5-24 11:09
    请参考屠龙刀、开天斧的示波器输入电路,ADC参考电压是Vref,输入是以Vref/2为0点参考,ADC读数为2048就 ...

    谢谢,我再看看手册研究一下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-8 18:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    15

    回帖

    829

    积分

    高级会员

    积分
    829
    发表于 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;
    }

    点评

    1、校准系数,比如实际电压为10V,显示电压为12V,则校准系数=10/12=0.83333。 2、我国市电频率50Hz,周期20ms,采样按N个周期时间为窗口,采样频率为8000Hz,则20ms对应160个采样,采样次数就是160的正数倍(即20ms  详情 回复 发表于 2023-5-25 15:18
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2927

    回帖

    6585

    积分

    超级版主

    积分
    6585
     楼主| 发表于 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。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-8 18:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    15

    回帖

    829

    积分

    高级会员

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

    非常感谢解释,现软硬件的原理都完全明白了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    22

    回帖

    85

    积分

    注册会员

    积分
    85
    发表于 2023-7-16 15:53:53 | 显示全部楼层
    这个程序移植到屠龙刀三,发现串口不工作。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-30 09:54 , Processed in 0.075800 second(s), 72 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表