文章目录

  • 1、Timer模块
    • 1.1、构造函数
    • 1.2、参数
    • 1.3、例程
    • 1.4、附录
  • 2、PWM功能设置
    • 2.1、构造函数
    • 2.2、参数
    • 2.3、例程

官方文档点这里

1、Timer模块

    K210中包含3个的定时器,每个定时器有4个通道可用。

1.1、构造函数

    class machine.Timer(id, channel, mode=Timer.MODE_ONE_SHOT, period=1000, unit=Timer.UNIT_MS, callback=None, arg=None, start=True, priority=1, div=0)

1.2、参数


mode参数解析:
    MODE_ONE_SHOT:一拍模式,即只能单次触发中断
    MODE_PERIODIC:周期模式,可以多次触发中断
    MODE_PWM:PWM模式
关于callback:
    可以将回调函数看成中断服务函数,在此选项中输入中断函数名称,在时间按到达要求之后即可调用该函数。

1.3、例程

例程1:
    定时3秒后打印信息

from machine import Timerdef on_timer(timer):#定义中断服务函数print("time up:",timer)#打印定时器设置信息print("param:",timer.callback_arg())#打印创建对象时输入的arg参数(如果是函数名称则输入函数存放地址)#于Timer0的0通道设置3s触发的单次中断
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_ONE_SHOT, period=3000, callback=on_timer, arg=on_timer)
print("period:",tim.period())#打印周期即时间

串行终端输出信息:

period: 3000
>>> time up: [MAIXPY]Timer:(802f0660) timer=0, channel=0, mode=0, period=3000ms, priority=1, div=0, callback=802f05e0, arg=802f05e0
param: <function on_timer at 0x802f05e0>

例程2:
    每隔 1 秒打印消息, 停止 5 秒后再重启, 5 秒后关闭并注销定时器

import time
from machine import Timerdef on_timer(timer):#定义中断服务函数print("time up:",timer)#打印定时器设置信息print("param:",timer.callback_arg())#打印创建对象时输入的arg参数(如果是函数名称则输入函数存放地址)#于Timer0的0通道设置1s触发的中断,设置优先级1(小→高),设置定时器不启动,时钟不分频
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=1, unit=Timer.UNIT_S, callback=on_timer, arg=on_timer, start=False, priority=1, div=0)
print("period:",tim.period())#打印周期即时间
tim.start()#启动定时器
time.sleep(5)#延时5S
tim.stop()#关闭定时器
time.sleep(5)#延时5S
tim.restart()#再次启动定时器
time.sleep(5)#延时5S
tim.stop()#关闭定时器
del tim#注销定时器、注销硬件占用、关闭硬件时钟

串行终端输出信息:

period: 1
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>
time up: [MAIXPY]Timer:(802f02c0) timer=0, channel=0, mode=1, period=1s, priority=1, div=0, callback=802eff60, arg=802eff60
param: <function on_timer at 0x802eff60>

1.4、附录

常量表:
    TIMER0: Timer0 id
    TIMER1: Timer1 id
    TIMER2: Timer2 id
    CHANNEL0: Timer 通道 0
    CHANNEL1: Timer 通道 1
    CHANNEL2: Timer 通道 2
    CHANNEL3: Timer 通道 3
    MODE_ONE_SHOT: Timer 只运行一次(回调一次)
    MODE_PERIODIC: Timer 始终运行(连续回调)
    MODE_PWM: 定时器不用来回调函数,用以产生PWM
    UNIT_S: 单位秒 (s)
    UNIT_MS: 单位毫秒 (ms)
    UNIT_US: 单位微秒 (us)
    UNIT_NS: 单位纳秒 (ns)


2、PWM功能设置

    Maix Dock开发板上刚好有一个RGB LED可以用来做彩灯以检验PWM的实现。关于点灯方面的教程戳这里。

2.1、构造函数

    class machine.PWM(tim, freq, duty, pin, enable=True)

2.2、参数


!!注意!!:
    实测duty参数为低电平占整个周期的百分比。

2.3、例程

例程1:
    十种颜色轮流切换。

from machine import Timer,PWM
import time
from fpioa_manager import board_infoTim0 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)#新建定时器对象于定时器0,0通道
Tim1 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM)
Tim2 = Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM)LEDR = PWM(Tim0, freq=500000, duty=0, pin=board_info.LED_R)#新建PWM对象于Tim0定时器对象,频率500000Hz,duty为0,映射到LED_R引脚
LEDG = PWM(Tim1, freq=500000, duty=0, pin=board_info.LED_G)
LEDB = PWM(Tim2, freq=500000, duty=0, pin=board_info.LED_B)'''
1.R 25 G 202 B 173
2.R 140 G 199 B 181
3.R 160 G 238 B 225
4.R 190 G 231 B 233
5.R 190 G 237 B 199
6.R 214 G 213 B 183
7.R 209 G 186 B 116
8.R 230 G 206 B 172
9.R 236 G 173 B 158
10.R 244 G 96 B 108
'''ColorIndex = 0  #颜色索引
Duty=0          #待计算的占空比
#RGB数值列表
ValR = [25 , 140, 160, 190, 190, 214, 209, 230, 236, 244]
ValG = [202, 199, 238, 231, 237, 213, 186, 206, 173, 96 ]
ValB = [173, 181, 255, 233, 199, 183, 116, 172, 158, 108]while True:Duty = 100 - ((ValR[ColorIndex] / 255) * 100)#根据RGB数值计算出相应的占空比参数LEDR.duty(Duty)Duty = 100 - ((ValG[ColorIndex] / 255) * 100)LEDG.duty(Duty)Duty = 100 - ((ValB[ColorIndex] / 255) * 100)LEDB.duty(Duty)time.sleep_ms(1500)                         #延时1.5sif ColorIndex < len(ValR) - 1:              #使颜色于1~10轮流切换ColorIndex += 1else:ColorIndex = 0

对应颜色表:

例程1++:
    相较于例程1使用了渐变切换的效果。

from machine import Timer,PWM
import time
from fpioa_manager import board_infoTim0 = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)#新建定时器对象于定时器0,0通道
Tim1 = Timer(Timer.TIMER0, Timer.CHANNEL1, mode=Timer.MODE_PWM)
Tim2 = Timer(Timer.TIMER0, Timer.CHANNEL2, mode=Timer.MODE_PWM)LEDR = PWM(Tim0, freq=500000, duty=100, pin=board_info.LED_R)#新建PWM对象于Tim0定时器对象,频率500000Hz,duty为0,映射到LED_R引脚
LEDG = PWM(Tim1, freq=500000, duty=100, pin=board_info.LED_G)
LEDB = PWM(Tim2, freq=500000, duty=100, pin=board_info.LED_B)'''
红:255 0   0
橙: 255 125 0
黄:255 255 0
绿:0   255 0
靛: 0   255 255
蓝:0   0   255
紫: 255 0   255
'''ColorIndex = 1  #颜色索引
Duty = 0        #待计算的占空比
DutyTempR = 0   #占空比临时值R
DutyTempG = 0   #占空比临时值G
DutyTempB = 0   #占空比临时值B
OperateTemp = 0 #计算产生的临时变量,用于使DutyTemp逼近Duty
#RGB数值列表
ValR = [255, 255, 255, 0  , 0  , 0  , 255]
ValG = [0  , 125, 255, 255, 255, 0  , 0  ]
ValB = [0  , 0  , 0  , 0  , 255, 255, 255]
#初始化RGB LED 使显示第一组颜色
Duty = 100 - ((ValR[0] / 255) * 100)#根据RGB数值计算出相应的占空比参数
DutyTempR = Duty
LEDR.duty(Duty)                     #赋值
Duty = 100 - ((ValG[0] / 255) * 100)#根据RGB数值计算出相应的占空比参数
DutyTempG = Duty
LEDG.duty(Duty)                     #赋值
Duty = 100 - ((ValB[0] / 255) * 100)#根据RGB数值计算出相应的占空比参数
DutyTempB = Duty
LEDB.duty(Duty)                     #赋值
time.sleep_ms(2000)                 #延时2s
while True:#RDuty = 100 - ((ValR[ColorIndex] / 255) * 100)#根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempR              #计算总差值OperateTemp /= 10                           #差值分10次补偿给DutyTempwhile DutyTempR != Duty:if OperateTemp > 0 and DutyTempR > Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakif OperateTemp < 0 and DutyTempR < Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakDutyTempR += OperateTemp                 #差值补偿if DutyTempR > 100:                     #防溢出操作DutyTempR = 100elif DutyTempR < 0:DutyTempR = 0LEDR.duty(DutyTempR)                    #赋值time.sleep_ms(100)                      #延时100msLEDR.duty(DutyTempR)                        #最终赋确定值,此时DutyTemp=Duty#GDuty = 100 - ((ValG[ColorIndex] / 255) * 100)#根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempG              #计算总差值OperateTemp /= 10                           #差值分10次补偿给DutyTempwhile DutyTempG != Duty:if OperateTemp > 0 and DutyTempG > Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakif OperateTemp < 0 and DutyTempG < Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakDutyTempG += OperateTemp                #差值补偿if DutyTempG > 100:                     #防溢出操作DutyTempG = 100elif DutyTempG < 0:DutyTempG = 0LEDG.duty(DutyTempG)                    #赋值time.sleep_ms(100)                      #延时100msLEDG.duty(DutyTempG)                        #最终赋确定值,此时DutyTemp=Duty#BDuty = 100 - ((ValB[ColorIndex] / 255) * 100)#根据RGB数值计算出相应的占空比参数OperateTemp = Duty - DutyTempB              #计算总差值OperateTemp /= 10                           #差值分10次补偿给DutyTempwhile DutyTempB != Duty:if OperateTemp > 0 and DutyTempB > Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakif OperateTemp < 0 and DutyTempB < Duty:#解决因小数精度问题而无法满足循环解除条件的问题breakDutyTempB += OperateTemp                #差值补偿if DutyTempB > 100:                     #防溢出操作DutyTempB = 100elif DutyTempB < 0:DutyTempB = 0LEDB.duty(DutyTempB)                    #赋值time.sleep_ms(100)                      #延时100msLEDB.duty(DutyTempB)                        #最终赋确定值,此时DutyTemp=Dutytime.sleep_ms(1500)                         #延时1.5sif ColorIndex < len(ValR) - 1:              #使颜色于红~紫轮流切换ColorIndex += 1else:ColorIndex = 0

【K210】【MaixPy】二、Maix Dock入门之Timer、PWM基础模块,实现一个变色呼吸灯(效果参考罗技G502)相关推荐

  1. 【K210】【MaixPy】三、Maix Dock入门之LCD的使用(播放BadApple)

    Maix Dock套件中标配了一块2.4寸LCD屏下面通过实现几个功能的方式介绍一些MaixPy中关于LCD使用的一些函数. 官方LCD函数文档链接:https://cn.maixpy.sipeed. ...

  2. 搞一下CP AUTOSAR 入门 | 02 CP AUTOSAR 基础模块功能描述

    前言 本系列请点击:<搞一下CP AUTOSAR入门> 所有系列请点击:<汽车电子系列分享> 在上一篇介绍了CP AUTOSAR的分层结构,对于多数使用AUTOSAR架构开发汽 ...

  3. AURIX TC397 Timer PWM 基础知识

    目录 Timer/PWM资源 STM GTM GPT12 CCU6 参考 微信公众号 Timer/PWM资源 TC397有下列Timer/PWM资源: 6x STM GTM 1x GPT12 1x C ...

  4. 【K210】【MaixPy】一、Maix Dock入门之FPIOA和GPIO

    文章目录 0.引言 1.关于类GPIO 2.关于全局变量board_info 3.关于类fpioa_manager 4.关于类FPIOA 5.代码     那么我们来进行神圣的点灯仪式吧.     本 ...

  5. 【FPGA】二、LED呼吸灯控制

    文章目录 前言 一.LED灯简介 二.LED呼吸灯实验 1.实验目的 2.程序设计 3.仿真验证 总结 前言 在FPGA学习中,LED灯实验作为一个经典的入门实验,其地位堪比编程界的"Hel ...

  6. K210入门 MAIX DOCK——点灯(二)

    目录 首先看现象 硬件连接 GPIO的介绍 GPIO() 类 特殊方法(函数) 1.value 2. irq() 3.disirq 4. mode 常量 主要程序 以后我会尽量,一直更新K210的操作 ...

  7. K210入门必看(MAIX DOCK)(一)

    目录 K210芯片上IO口 板子上的引脚 如何理解[引脚]映射[内部功能]? fpioa_manage 类 1.register(pin, func, force=True) 2.unregister ...

  8. K210频谱显示桌面摆件(Sipeed Maix Dock)

    前言 看到很多UP主的桌面上都摆上了响度显示摆件,就想着自己动手做一个,刚好手头有不用的Maix Dock K210开发板.因为K210带有FFT所以可以直接做一个频谱显示摆件. 代码 根据官方教程的 ...

  9. [K210]Maixpy self learning classifier 自学习分类器

    硬件平台:K210 Sipeed Maix Dock 软件平台:maixpy 实现功能:自学习分类,无需在pc上训练分类,在K210上就可以 实现步骤 一.下载固件 maixpy固件 其中,各文件说明 ...

最新文章

  1. 2012 Stackoverflow meetup at Shanghai PRC
  2. RMAN 的备份保留策略
  3. mysql alert on delete cascade_如何在mysql中删除级联使用?(How do I use on delete cascade in mysql?)...
  4. SQL经典面试题及答案
  5. 使用rman本机复制新数据库
  6. 《深入浅出数据分析》样章下载
  7. Exchange2003-2010迁移系列之十一,Exchange2010 OWA配置
  8. Delphi更高效率的编程方式的思考【一】
  9. 联合国超10万名员工记录遭泄露
  10. windows 9X, 2000, xp所有版本注册表设置(1)
  11. 李刚的《疯狂Java讲义》
  12. 智能优化算法:水循环算法-附代码
  13. UltraEdit-32 温馨提示:右协会,取消 bak文件
  14. Hadoop学习总结之Map-Reduce的过程解析
  15. 几乎最全的中文NLP资源库
  16. 文本对比工具哪些好用?竟然有在线的。真香。
  17. Macbook 黑白打印pdf设置
  18. 五、python的数据容器(站在前辈们的肩膀上注入自己的理解,强势总结,适合入门,也适合复习)
  19. Anaconda安装过程中遇到的诡异事件
  20. c#语言中if语句多条件,关于C# if语句中并列条件的执行

热门文章

  1. java中为什么不能强制转换_为什么Java中的强制转换异常致命?
  2. 鸿蒙手机播放音乐-第一集
  3. oracle先进先出法,怎样能过SQL计算先进先出库龄分析?
  4. python程序的运行速度在所有计算机语言中最快_【编程专题】实测四种编程语言的运算速度,最快的竟然是它!...
  5. 随机调用mysql数据库表值10条php_PHP随机显示mysql数据库中的数据
  6. mysql 删除了授权_mysql用户授权访问与删除授权
  7. 单体预聚合的目的是什么_第七章 配位聚合
  8. win10下wifi链接成功,qq可以登录,浏览器无法上网的问题处理
  9. SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
  10. 【转】Java计算文件的hash值