本文來源電子發(fā)燒友社區(qū),作者:z趙先森, 帖子地址:https://bbs.elecfans.com/jishu_2290905_1_1.html
pwm測試視頻(開發(fā)板體驗視頻,詳見作者原文鏈接內(nèi)容)
@TOC
**本文使用環(huán)境:
電腦:windows10
主控:air105(204MHZ)**
注意:本文默認已經(jīng)搭建好平臺。
前言
這篇文章主要記錄air105的初始lutaos嘗試,之前一直在使用C語言進行開發(fā),這次換一個開發(fā)方式。
主要使用ADC-TIM-PWM,為了提升技術難度,將三個串起來:
使用PC7/PWM5(其他的PWM都不方便接出來)產(chǎn)生1MHZ動態(tài)變化的的PWM,然后由PC4的ADC5獲取,并轉化成實際的電壓。C7產(chǎn)生的PWM通過不斷的改變比較值可以輸出不同的電壓,所以就能夠滿足ADC的采集要求,這里需要注意的是,不能直接測量電源電壓,要不然要燒。。。。。ADC的電壓范圍為0-1.8V
LuatOS對于方案來說非常友好,對新手也比較友好,隔離了底層的驅動,不需要關心底層怎么實現(xiàn),只需要調用官方的API就行,極大的解決了不同芯片重復使用相同外設的問題,非常方便。
一、手冊
1、 AIR105的硬件手冊
查看105的手冊了解其IO分布和各方面的性能,主要看以下幾個:
手冊分別為:
1.1、主頻:
1.2、ADC和PWM:
2、LutaOS編程手冊
2.1. PWM編程
找到在線文檔的LuatOS-SOC接口文檔,并找到PWM模塊,
往下翻官方給出了demo實例,手冊中有詳細的說明對于每一個參數(shù):
-- 打開PWM5, 頻率1kHz, 占空比50%
pwm.open(5, 1000, 50)
-- 打開PWM5, 頻率10kHz, 分頻為 31/256,即31的高電平256-31的低電平
pwm.open(5, 10000, 31, 0, 256)
本文需要關心占空比和PWM的頻率,ADC測量電壓時,最好將PWM的頻率稍微打一下二,否者檢測的數(shù)據(jù)可能不準,因為電路沒有濾波采樣到的數(shù)據(jù)不是那么準確。兩個函數(shù)都可以使用。后續(xù)只需要改變占空比即可。
2.2. ADC編程
同樣找到ADC的數(shù)模轉換章節(jié):
adc有三個函數(shù):open、read、close。功能和名字一樣非常簡單,各參數(shù)也都有詳細的講解,不再贅述。特別要注意。==AIR105的ADC只能檢測外部1.8V的電壓,不能超過==。。。。。如果需要檢測高電壓,采用電阻分壓的方式,兩個電阻串聯(lián)檢測中間的電壓即可。
2.3. TIME編程
查看sys庫,定時器在sys中:
如圖該函數(shù)為循環(huán)定時功能函數(shù),需要注意該函數(shù)內(nèi)==不能使用wait函數(shù)。==
二、編程
本文采用定時器對pwm進行調節(jié),首先對定時器和ADC進行編程介紹,然后是PWM。
1、 TIME和ADC編程
local time_num = 0;
local dir_num = 0;
sys.timerLoopStart(function()
if time_num >= 55 then
dir_num = 0
elseif time_num <= 0 then
dir_num = 1
end
if dir_num == 1 then
time_num = time_num + 1;
else
time_num = time_num - 1;
end
log.info("task", time_num,"adc_read:",adc.read(5)) -- 500毫秒后才會執(zhí)行
end, 500)
首先定義兩個變量,一個自加,一個方向。當自加到最大值時,方向取反,依次內(nèi)推,減到最小亦是如此。==最大值為什么設置為55?因為IO口電壓為3V3,按照0-100等份,及55為1.8V左右== 根據(jù)前面的介紹可知,ADC打開后僅使用讀取函數(shù)即可,故在輸出的位置進行打印讀取。
測試結果如下:
可以看見測試結果和預想的一樣。
2、PWM編程
有了前面的基礎,PWM編程就會非常簡單,只需要調用相關的函數(shù)即可,同時需要在程序循環(huán)之前的位置打開adc。直接上程序:
sys.taskInit(function()
adc.open(5) -- 5通道是PC4, 0~1.8v,不要超過范圍使用!!!,其它通道也是同樣的范圍
while 1 do
pwm.open(5, 1000000, time_num, 0, 100)
sys.wait(200)
end
adc.close(1)
end)
這里只看pwm.open(5, 1000000, time_num, 0, 100)
即可。time_num
為定時器修改的PWM值,范圍是0-55。最后的100表示比較的最大值為100。
為了對PWM進行測試,使用萬用便測量IO口的電壓。測試結果如下:
見開頭視頻
3、 完整程序
話不多說直接上程序。
-- LuaTools需要PROJECT和VERSION這兩個信息
PROJECT = "mytest"
VERSION = "1.0.0"
log.info("mymain", PROJECT, VERSION)
-- 一定要添加sys.lua !!!!
local sys = require "sys"
local time_num = 0;
local dir_num = 0;
--添加硬狗防止程序卡死
if wdt then
wdt.init(15000)--初始化watchdog設置為15s
sys.timerLoopStart(wdt.feed, 10000)--10s喂一次狗
end
--定時器1s
sys.timerLoopStart(function()
if time_num >= 55 then
dir_num = 0
elseif time_num <= 0 then
dir_num = 1
end
if dir_num == 1 then
time_num = time_num + 1;
else
time_num = time_num - 1;
end
log.info("task", time_num,"adc_read:",adc.read(5)) -- 1000毫秒后才會執(zhí)行, 打印 task A B C
end, 500)
sys.taskInit(function()
adc.open(5) -- 5通道是PC4, 0~1.8v,不要超過范圍使用!!!,其它通道也是同樣的范圍
while 1 do
pwm.open(5, 1000000, time_num, 0, 100)
sys.wait(200)
--log.info("adc_read:",adc.read(5))
end
adc.close(1)
end)
-- 用戶代碼已結束---------------------------------------------
-- 結尾總是這一句
sys.run()
-- sys.run()之后后面不要加任何語句!!!!!
4、測試
電壓是先變小再變大,然后再變小變大,依次循環(huán)。
見末尾視頻
pwm_adc測試視頻(開發(fā)板體驗視頻,詳見作者原文鏈接內(nèi)容)
-
合宙通信
+關注
關注
0文章
146瀏覽量
1717 -
Air105
+關注
關注
0文章
48瀏覽量
289
發(fā)布評論請先 登錄
相關推薦
評論