H7-TOOL的LUA小程式教程第15期:電壓,電流,NTC熱敏電阻以及4-20mA輸入(2024-10-21,已經發布)

硬汉嵌入式發表於2024-10-22

LUA指令碼的好處是使用者可以根據自己註冊的一批API(當前TOOL已經提供了幾百個函式供大家使用),實現各種小程式,不再限制Flash裡面已經下載的程式,就跟手機安裝APP差不多,所以在H7-TOOL裡面被廣泛使用,支援線上除錯執行,支援離線執行。TOOL的LUA教程爭取做到大家可以無痛呼叫各種功能函式,不需要學習成本。


簡介

電壓,電流,NTC熱敏電阻以及4-20mA輸入,可以在上位機端設定,也可以螢幕端設定

詳細使用說明可以看線上或者離線操作說明手冊:https://www.armbbs.cn/forum.php?mod=viewthread&tid=95373

建議優先熟悉下,特別是這幾個功能對應使用的引腳。


LUA函式說明:

1、啟動模擬量採集。

啟動模擬量採集僅需用到兩個大類配置,一個負載電流測量,還有一個低速多通道。

所以啟動模擬訊號採集封裝了兩種配置

(1)負載電流測量,配置程式碼固定如下:

function start_dso(void)
        write_reg16(0x01FF, 1) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end

(2)低速多通道測量,配置程式碼固定如下:

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end

2、測量函式,讀取模擬值

測量函式比較簡單,週期呼叫即可,建議100ms以上讀取一次,因為所有資料100ms更新一輪

read_analog(9) --9 - 讀取4-20mA


(1)電壓讀取

read_analog(0) -- 0 - CH1電壓
read_analog(1) -- 1 - CH2電壓

舉例:每500ms讀取一次CH1和CH2通道電壓

實現程式碼如下:

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動電壓測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_analog(0) -- 0 - CH1電壓
data2 = read_analog(1) -- 1 - CH2電壓
print(string.format("CH1電壓:%f,CH2電壓:%f", data1,data2))
delayms(500)
end

實際效果:


(2)高側負載測量

read_analog(2) --2 - 高側負載電壓
read_analog(3) --3 - 高階負載電流

舉例:每500ms讀取一次

實現程式碼如下

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 1) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動高側測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_analog(2) --2 - 高側負載電壓
data2 = read_analog(3) --3 - 高階負載電流
print(string.format("負載電壓:%f,負載電流:%f", data1,data2))
delayms(500)
end

實際效果:


(3)TVCC測量

read_analog(4) --4 - TVCC電壓
read_analog(5) --5 - TVCC電流

舉例:每500ms讀取一次

實現程式碼如下:

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動TVCC測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_analog(4) --4 - TVCC電壓
data2 = read_analog(5) --5 - TVCC電流
print(string.format("TVCC電壓:%f,TVCC電流:%f", data1,data2))
delayms(500)
end

(4)NTC熱敏電阻測量

read_analog(6) --6 - NTC熱敏電阻阻值

舉例:每500ms讀取一次

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動NTC熱敏電阻測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_analog(6) --6 - NTC熱敏電阻阻值
print(string.format("NTC熱敏電阻:%f", data1))
delayms(500)
end

(5)供電電壓測量

read_adc(7) --7 - 外部供電電壓
read_analog(8) --8 - USB供電電壓

舉例:每500ms讀取一次

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動供電電壓測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_adc(7) --7 - 外部供電電壓
data2 = read_analog(8) --8 - USB供電電壓
print(string.format("外部供電電壓:%f, USB供電電壓:%f", data1, data2))
delayms(500)
end

(6)4-20mA測量
read_analog(9) -- 4-20mA測量

舉例:每500ms讀取一次

--啟動模擬量電路
function start_dso(void)
        write_reg16(0x01FF, 2) -- 測量模式 0:示波器 1:負載電流 2:多路低速掃描
        write_reg16(0x0200, 1) -- CH1耦合,0:AC 1:DC
        write_reg16(0x0201, 1) -- CH2耦合,0:AC 1:DC
 
        --量程取值 0:±13.8V 1:±6.4V 2:±3.2V 3:±1.6V 4:±800mV 5:±400mV 6:±200mV 7:±100mV
        write_reg16(0x0202, 0) -- CH1量程
        write_reg16(0x0203, 0) -- CH2量程
        write_reg16(0x0204, 0) -- CH1通道直流偏值,未用
        write_reg16(0x0205, 0) -- CH2通道直流偏值,未用
        write_reg16(0x0206, 12) --取樣頻率 0:100 1:200 2:500 3:1K 4:2K 5:5K 6:10K 7:20K
                                                        --8:50K 9:100K 10:200K 11:500K 12:1M 13:2M 14:5M
        write_reg16(0x0207, 0) --取樣深度 0:1K 1:2K 3:4K 4:8K 5:16K 6:32K
        write_reg16(0x0208, 32768) --觸發電平ADC 0-65535
        write_reg16(0x0209, 50) --觸發位置百分比 0-100
        write_reg16(0x020A, 0) --觸發模式 0:自動 1:普通 2:單次
        write_reg16(0x020B, 0) --觸發通道 0:CH1 1:CH2
        write_reg16(0x020C, 0) --觸發邊沿 0:下降沿 1:上升沿 
        write_reg16(0x020D, 0x03) --通道使能控制 bit0 = CH1  bit1 = CH2
        write_reg16(0x020E, 1) --採集控制 0:停止 1:啟動
  end
 
print("啟動4-20mA測量")
start_dso() -- 呼叫一次初始化
 
for i = 1, 10, 1 do -- 讀取10次
data1 = read_analog(9) -- 4-20mA測量
print(string.format("4-20mA讀取:%f", data1, data2))
delayms(500)
end

測量的10mA,精度還是非常不錯的


3、測量函式,直接讀取ADC值

這個用法和第2步讀取模擬值是完全一樣的。只是這裡獲取的是ADC支援。

read_adc(0) --0 - CH1電壓
read_adc(1) --1 - CH2電壓
read_adc(2) --2 - 高側負載電壓
read_adc(3) --3 - 高階負載電流
read_adc(4) --4 - TVCC電壓
read_adc(5) --5 - TVCC電流
read_adc(6) --6 - NTC熱敏電阻阻值
read_adc(7) --7 - 外部供電電壓
read_adc(8) --8 - USB供電電壓
read_adc(9) -- 9 - 4-20mA輸入

4、使用上位機同時展示這些數值

相關文章