【测试】AIR105+PWM+ADC+TIM联测

本文使用环境:
电脑:windows10
主控:air105(204MHZ)

注意:本文默认已经搭建好平台。

前言

首先非常感谢电子发烧友合宙的大力支持。
这篇文章主要记录air105的初始lutaos尝试,之前一直在使用C语言进行开发,这次换一个开发方式。
主要使用ADC-TIM-PWM,为了提升技术难度,将三个串起来:

使用PC7/PWM5(其他的PWM都不方便接出来)产生1000HZ动态变化的的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(1) -- 1通道是PC0, 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口的电压。测试结果如下:

pwm测试视频

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、测试

电压是先变大再变小,然后再变大变小,依次循环。

air105_pwm_adc测试视频

猜你喜欢

转载自blog.csdn.net/qq_37280428/article/details/125587509