硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5147|回复: 2
收起左侧

[Lua] lua小程序实现6通道振动加速度、速度、位移测量显示

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2021-4-30 09:44:20 | 显示全部楼层 |阅读模式
借用H7-TOOL小程序的强大功能,大幅度提高批量测试效率。


待测主板的功能:测量 6通道振动信号,输出6通道加速度、速度、位移,共18个模拟量。 MODBUS RTU从站,RS232接口和RJ45以太网接口.

这是为客户定制的一个产品(不对第3方销售),好几月生产一次,测试繁琐。需要一台信号发生器输出500mV 80H正弦信号,还需要开启PC Modbus Poll软件配置好参数扫描所有的模拟量,人眼观测数据。
每次生产都忘记测试流程和判据,换1个人测的话还要从头培训一次。
现在用lua小程序功能,无需操作信号发生器,无需电脑,任何人都可以来测试了。

硬件连接:
  - 待测主板的RS232串口接入H7-TOOL的RS232串口。
  - H7-TOOL的VOUT (DAC电压)依次接待测主板的传感器输入脚(外加隔离直流电路)

今天开始用lua小程序功能来模拟信号发生器和ModbusPoll的功能。

振动测试_发布.jpg

振动界面.png



程序代码在此:
振动测量.lua (3.41 KB, 下载次数: 16)

传感器插入后,数值范围正确时背景显示为绿色



评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2021-4-30 23:05:34 | 显示全部楼层
--GUIMODE=1   --用于识别GUI程序还是print程序

COMx = 1
g_RegFloat = {}  --全局变量 16个通道的寄存器数据 浮点数,第1个单元是错误状态
g_acc = {0,0,0,0,0,0}
g_spd = {0,0,0,0,0,0}
g_mov = {0,0,0,0,0,0}

print("六通道振动测试V1.0")
        
function main(void)

        beep()
        
        lcd_clr(0xFFFF) --背景白色
        
        DispTitle("六通道振动测试V1.0")
        DispHead()
        
        lcd_refresh()
        
        CfgDacWave(500, 80) --VOUT 输出500mV, 80Hz 正弦
        
        --uart_cfg(port, BaudRate, Parity, WordLength, StopBits)
        uart_cfg(COMx, 115200, 0, 8, 1)
        
        while(1)
        do
                RS232ScanModbusReg() --扫描modbus寄存器一次
               
                DispResult() --显示读取结果
               
                lcd_refresh()

                key = get_key()
                if (key == 2) then                  --短按S,实时采集一次
                        
                elseif (key == 3) then        --长按S,实时采集一次,作为常温
                        
                elseif (key == 8) then
                        
                end
        end
end

--配置DAC波形输出
function CfgDacWave(VppmV, freq)
        write_reg16(0x0100, 0) --0 保留功能
        write_reg16(0x0101, 1) --DAC波形类型, 0:输出电平 1:正弦 2:输出方波 3:三角波
        write_reg16(0x0102, -VppmV / 2) --波谷电压,mV
        write_reg16(0x0103, VppmV / 2)  --波峰电压,mV
        write_reg16(0x0104, freq >> 16)                        --32bit 波形频率高16bit,Hz
        write_reg16(0x0105, freq & 0xFFFF)        --32bit 波形频率低16bit,Hz */
        write_reg16(0x0106, 50)  --波形占空比 百分比
        write_reg16(0x0109, 1) --启动输出
end

--显示标题
function DispTitle(str)        
        lcd_disp_str(0, 0, str, 24, 0xFFFF, 0x0014, 240, 1)        
end

function DispHead(void)               
        local x
        local y
        local bg
        local ct
        
        lcd_disp_str(5, 26, "500mV", 24,  0x0000, 0xC7F9, 110, 1)
        lcd_disp_str(125, 26, "80Hz", 24, 0xFFF9, 0xF2A6, 110, 1)        
        
        bg = RGB565(150,150,150) --灰色
        ct = 0xFFFF --文字白色
        y = 26 + 30
        x = 5
        lcd_disp_str(5, y,           "加速度", 16, ct, bg, 80, 1)
        lcd_disp_str(5 + 85, y,      "速度",   16, ct, bg, 80, 1)
        lcd_disp_str(5 + 85 + 85, y, "位移",   16, ct, bg, 60, 1)
end

--RS232接口,扫描modbus寄存器一次
function RS232ScanModbusReg(void)
        local Addr485 = 1
        local TimeOut = 1000
        local RegAddr = 24
        local RegNum = 18
        
        g_RegFloat = {modbus_read_float(COMx, TimeOut, Addr485, RegAddr, RegNum)}
        --print(g_RegFloat[1], g_RegFloat[2], g_RegFloat[3], g_RegFloat[4])
end

--显示6通道测量值
function DispResult()
        local i
        local buf
        local x
        local y
        local w
        local ff
        local acc
        local err_bg = 0xFFE0  --错误背景色
        local ok_bg = 0xC7F9 --ok背景色
        local bg
        
        if (g_RegFloat[1] == nil) then
                return
        end
        
        if (g_RegFloat[1] > 0) then
                return
        end               
        
        for i = 0,5,1 do
                --加速度
                ff = g_RegFloat[i * 1 + 2]
                g_acc[i + 1] = ff
                if (ff == nil) then return end
                buf = string.format("%0.2f", ff)                        
                x = 5
                y = 26 + 33 + 20 + (i - 0) * 24
                if (i >= 3) then        --分行
                        y = y + 8
                end               
                w = 80               
                if (ff > 23 and ff < 25) then
                        bg = ok_bg
                else
                        bg = err_bg
                end
                lcd_disp_str(x, y, buf, 16, 0x0000, bg, w, 1)

                --速度
                ff = g_RegFloat[i * 1 + 8]
                g_spd[i + 1] = ff
                if (ff == nil) then return end
                buf = string.format("%0.2f", ff)               
                x = x + w + 5
                if (ff > 31 and ff < 35) then
                        bg = ok_bg
                else
                        bg = err_bg
                end               
                lcd_disp_str(x, y, buf, 16, 0x0000, bg, w, 1)        
               
                --位移
                ff = g_RegFloat[i * 1 + 14]
               
                g_mov[i + 1] = ff
                if (ff == nil) then return end        
                buf = string.format("%0.3f", ff)                        
                x = x + w + 5
                if (ff > 0.175 and ff < 0.195)  then
                        bg = ok_bg
                else
                        bg = err_bg
                end        
                lcd_disp_str(x, y, buf, 16, 0x0000, bg, 60, 1)
               
        end
end

main()
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2021-5-1 07:40:52 | 显示全部楼层
非常实用的功能
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 21:50 , Processed in 0.271429 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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