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