从零玩转CanMV-K230(9)-Timer、RTC、ADC、WDT、File
文章目录
- 前言
- 一、Timer
- 构造函数
- 初始化
- 销毁函数
- 示例代码
- 二、RTC
- 构造函数
- init
- datetime
- 示例代码
- 三、ADC
- API
- 示例代码
- 四、WDT
- API
- 示例代码
- 五、File
- 示例代码
- 总结
前言
本章介绍K230常用外设的使用方法,相关内容的详细介绍可以参考K210的教程,这里主要展示K230的使用代码
一、Timer
定时器(Timer)的作用在于生成精确的计时,当达到预设的时间点时,提醒我们进行特定的操作。
Timer类位于machine模块下,因此在使用该类时,需要从machine模块中进行引用。
构造函数
timer = Timer(index, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
【参数】
index: Timer号,取值:[-1,5],-1代表软件定时器
mode: 运行模式,单次或周期,可选参数
freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period
period: Timer运行周期,单位ms,可选参数
callback: 超时回调函数,必须设置,要带一个参数
arg: 超时回调函数参数,可选参数
注意: [0-5]硬件Timer暂不可用
初始化
Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
初始化定时器参数
【参数】
mode: 运行模式,单次或周期,可选参数
freq: Timer运行频率,支持浮点,单位Hz,可选参数,优先级高于period
period: Timer运行周期,单位ms,可选参数
callback: 超时回调函数,必须设置,要带一个参数
arg: 超时回调函数参数,可选参数
【返回值】
无
销毁函数
Timer.deinit()
释放Timer资源
【参数】
无
【返回值】
无
示例代码
from machine import Timer
import time
def fun(i):
print("Timer callback")
#使用软件定时器,编号-1
tim = Timer(-1)
tim.init(mode=Timer.PERIODIC, period=100, callback=fun) #周期为100ms
while True:
time.sleep(0.01) #避免CPU满跑
二、RTC
RTC全称是Real Time Clock,可以用来进行精准的时间计时,我们现在常用的万年历或数字时钟常常就是使用类似的芯片DS1302等等实现计时的功能。K230内置一个RTC,但是这块板子上没有额外的电池,所以要想让RTC一直工作的话,需要板子一直进行上电。
RTC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。
RTC的主要功能就是获取实时的时间,当然也可以使用函数进行重新设定时间。
构造函数
rtc = RTC()
【参数】
无
init
rtc.init(year,mon,day,hour,min,sec,microsec)
【参数】
year: 年
mon: 月
day: 日
hour: 时
min: 分
sec: 秒
microsec: 微秒
【返回值】
无
datetime
print(rtc.datetime())
【参数】
无
【返回值】
year: 年
mon: 月
day: 日
hour: 时
min: 分
sec: 秒
microsec: 微秒
示例代码
代码如下(示例):
from machine import RTC
import time
rtc = RTC()
if rtc.datetime()[1] != 10:
rtc.datetime((2024, 12, 30, 0, 0, 0, 0, 0))
while True:
print(rtc.datetime())
time.sleep(1)
三、ADC
物理世界中的大部分的信号都是模拟量,但是随着单片机的发展,越来越多需要数字信号的处理,因此将模拟信号转换成为数字信号就显得尤为重要。
K230内置了一个ADC,其具有6个通道(该开发板引出了四个ADC通道,分别是0-4,其中0和1的量程为0-3.6V,2和3的量程为0-1.8V),采样分辨率为12bit,采样的速率可以达到1MHz。
ADC类位于machine模块下,因此我们在使用这个类的时候要从machine模块中进行引用。
API
adc = ADC(channel)
【参数】
channel: ADC通道号,取值:[0,5]
ADC.read_u16()
获取通道采样值
【参数】
无
【返回值】
返回当前ADC通道采样值,[0-4095]
ADC.read_uv()
获取通道电压值
【参数】
无
【返回值】
返回当前ADC通道电压值,[0-1800000]
示例代码
from machine import ADC
import time
adc = ADC(0)
while True:
print(adc.read_u16())
print('%.2f'%(adc.read_uv()/1000000*2), "V")
time.sleep(1)
四、WDT
看门狗是单片机用来防止软件程序跑飞,从而出现问题的一种内部机制。其本质可以看作是一个定时器,当开启看门狗后,定时器开始运行,在定时器到达设定的重启时间之前要进行喂狗(即重置一下定时器),若超过设定的时间没有进行喂狗,就会通过软件复位的方式,将程序进行复位,从而避免了程序跑飞出现的问题。
K230内部包含两个WDT硬件模块,用于在应用程序崩溃且最终进入不可恢复状态时重启系统。一旦开始,当硬件运行期间没有定期进行喂狗(feed)就会在超时后自动复位。
API
wdt = WDT(id=1, timeout=5)
【参数】
id: WDT号,取值:[0,1],默认1
timeout: 超时值,单位s,默认5
注意: WDT0暂不可用
WDT.feed()
喂狗操作
【参数】
无
【返回值】
无
示例代码
from machine import WDT
import time
wdt = WDT(1,3)
for i in range(3):
time.sleep(1)
print(i)
wdt.feed()
while True:
time.sleep(0.01)
五、File
在其他的单片机中我们要是想断电后保存一些数据的话,通常会使用EEPROM或者Flash进行数据的存储。在K230中自带一个文件系统,因此我们直接使用K230的文件系统就可以实现数据的存储和获取。
K230进行文件操作的方式和Python的文件操作方式是一样的。K230的文件路径为/sdcard,所创建的文件,直接存储在这个路径下即可。
示例代码
f = open('/sdcard/1.txt', 'w')
f.write('EEWORLD')
f.close()
f = open('/sdcard/1.txt', 'r')
text = f.read()
print(text)
f.close()
总结
本章提供了Timer、RTC、ADC、WDT、File的基本用法,供参考,后面我们开始K230在AI领域的应用例程。