@TOC
**本文使用环境:
电脑:windows10
主控:air105(204MHZ)**
注意:本文默认已经搭建好平台。
前言
首先非常感谢电子发烧友和合宙的大力支持。
这篇文章主要记录air105的初始lutaos尝试,之前一直在使用C语言进行开发,这次换一个开发方式。
主要使用ADC-TIM-PWM,为了提升技术难度,将三个串起来:
使用PC7/PWM5(其他的PWM都不方便接出来)产生1MHZ动态变化的的PWM,然后由PC4的ADC5获取,并转化成实际的电压。C7产生的PWM通过不断的改变比较值可以输出不同的电压,所以就能够满足ADC的采集要求,这里需要注意的是,不能直接测量电源电压,要不然要烧。。。。。ADC的电压范围为0-1.8V
LuatOS对于方案来说非常友好,对新手也比较友好,隔离了底层的驱动,不需要关心底层怎么实现,只需要调用官方的API就行,极大的解决了不同芯片重复使用相同外设的问题,非常方便。
一、手册
1、 AIR105的硬件手册
查看105的手册了解其IO分布和各方面的性能,主要看以下几个:
手册分别为:
在线wiki
105手册
1.1、主频:
1.2、ADC和PWM:
2、LutaOS编程手册
2.1. PWM编程
找到在线文档的LuatOS-SOC接口文档,并找到PWM模块,
往下翻官方给出了demo实例,手册中有详细的说明对于每一个参数:
-- 打开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的频率稍微打一下二,否者检测的数据可能不准,因为电路没有滤波采样到的数据不是那么准确。两个函数都可以使用。后续只需要改变占空比即可。
2.2. ADC编程
同样找到ADC的数模转换章节:
adc有三个函数:open、read、close。功能和名字一样非常简单,各参数也都有详细的讲解,不再赘述。特别要注意。==AIR105的ADC只能检测外部1.8V的电压,不能超过==。。。。。如果需要检测高电压,采用电阻分压的方式,两个电阻串联检测中间的电压即可。
2.3. TIME编程
查看sys库,定时器在sys中:
如图该函数为循环定时功能函数,需要注意该函数内==不能使用wait函数。==
二、编程
本文采用定时器对pwm进行调节,首先对定时器和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毫秒后才会执行
end, 500)
首先定义两个变量,一个自加,一个方向。当自加到最大值时,方向取反,依次内推,减到最小亦是如此。==最大值为什么设置为55?因为IO口电压为3V3,按照0-100等份,及55为1.8V左右== 根据前面的介绍可知,ADC打开后仅使用读取函数即可,故在输出的位置进行打印读取。
测试结果如下:
可以看见测试结果和预想的一样。
2、PWM编程
有了前面的基础,PWM编程就会非常简单,只需要调用相关的函数即可,同时需要在程序循环之前的位置打开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毫秒后才会执行, 打印 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、测试
电压是先变小再变大,然后再变小变大,依次循环。
见末尾视频