锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-01-24 05:30:00 120mr采样电阻

这是目录

  • 前言
  • 一、手册
    • 1、 AIR105的硬件手册
      • 1.1、主频:
      • 1.2、ADC和PWM:
    • 2、LutaOS编程手册
      • 2.1. PWM编程
      • 2.2. ADC编程
      • 2.3. TIME编程
  • 二、编程
    • 1、 TIME和ADC编程
    • 2、PWM编程
    • 3、 完整程序
    • 4、测试

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

注:本文默认搭建平台。

前言

首先,我非常感谢电子爱好者和合宙的大力支持。
本文主要记录air105的初始lutaos尝试一下,以前一直用C语言开发,这次改变了开发方法。
主要使用ADC-TIM-PWM,为提高技术难度,将三个串起来:

使用PC7/PWM5(其他的PWM都不方便接出来)产生1000HZ动态变化PWM,然后由PC4的ADC获取并转化为实际电压。C7产生的PWM不同的电压可以通过不断改变比较值来输出,因此可以满足要求ADC这里需要注意的是,电源电压不能直接测量,否则会燃烧。。。。。ADC0-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测试视频

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章