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、使用上位機同時展示這些數值