首先导入ADC以及构造函数
from machine import ADC
构造函数
adc = ADC(channel)
参数:
channel: 表示要使用的 ADC 通道号
庐山派可用的通道只有四个
ADC.read_u16()
获取指定通道的当前采样值
参数:
无
返回值:
返回该 ADC 通道的采样值,范围为 [0, 4095]
ADC.read_uv()
获取指定通道的当前电压值 (微伏)
参数:
无
返回值:
返回该 ADC 通道的电压值,单位为微伏(uV),范围为 [0, 1800000] 微伏
from machine import ADC
import time
# 实例化 ADC 通道 0,用于读取模拟信号的数字值
adc = ADC(0)
# 主循环,持续运行程序逻辑
while True:
# 获取 ADC 通道 0 的采样值
# ADC 采样值是一个无符号 16 位整数,范围为 0 到 65535
adc_value = adc.read_u16()
# 获取 ADC 通道 0 的电压值,单位为微伏(uV)
adc_voltage_uv = adc.read_uv()
# 将电压值从微伏转换为伏特(V)
# 1 伏特 = 1,000,000 微伏
adc_voltage_v = adc_voltage_uv / (1000 * 1000)
# 打印采样值和电压值
# 输出格式为 "ADC Value: <采样值>, Voltage: <微伏值> uV, <伏特值> V"
print("ADC Value: %d, Voltage: %d uV, %.6f V" % (adc_value, adc_voltage_uv, adc_voltage_v))
# 简单延时 100 毫秒,防止主循环运行速度过快
time.sleep_ms(100)
Real-Time Clock 是一种能够提供持续、精确的日期和时间信息的硬件或外设模块,可在系统断电后依然通过备用电源运行,以保持时间不丢失
导入RTC
from machine import RTC
构造函数
rtc = RTC()
rtc.init((year, mon, day, week,hour, min, sec, microsec))
参数 | 内容 |
---|---|
year | 年 |
mon | 月 |
day | 日 |
week | 星期几 |
hour | 时 |
min | 分 |
sec | 秒 |
microsec | 微秒 |
参数应该是一个元组,如果缺少括号会报错
返回值:
无
print(rtc.datetime())
参数:
无
返回值:
返回当前日期和时间信息,包括:year: 年,mon: 月,day: 日,hour: 时
,min: 分,sec: 秒,microsec: 微秒
from machine import FPIOA
from machine import RTC
#构造rtc
rtc = RTC()
print("RTC 构造完成,当前时间:", rtc.datetime())
#初始化rtc
rtc.init((2025,1,26,7,20,0,0,0))
#获取时间,获取值应该是一个元组
current_time = rtc.datetime()
print("RTC 初始化完成,当前时间:", rtc.datetime())
print("当前时间 %d年%d月%d日,%d:%d:%d" % (current_time[0],current_time[1],current_time[2],current_time[4]
,current_time[5],current_time[6]))
K230 内部集成了 6 个 Timer 硬件模块,最小定时周期为 1 毫秒(ms)
导入定时器
当前固件只支持软件定时器,K230内部的硬件定时器暂不可用
from machine import Timer
构造函数
timer = Timer(index, mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
参数 | 内容 |
---|---|
index | 定时器模块编号,取值范围为 [-1, 5],-1 表示软件定时器,0~5 为硬件定时器编号,【但当前不可用】 |
mode | 定时器运行模式,可选 Timer.ONE_SHOT 或 Timer.PERIODIC,ONE_SHOT:定时器在触发一次回调后自动停止,PERIODIC:定时器在触发回调后会自动重置周期,持续周期性触发 |
freq | 定时器频率(Hz),可以为浮点数。如果设置了 freq,则定时器的时间间隔由频率决定,freq 优先级高于 period。例如,freq=1 相当于 period=1000ms |
period | 定时器周期,单位为毫秒(ms),如果未设置 freq,则以 period 为准 |
callback | 超时回调函数。当定时器计数完成后自动调用该函数,函数至少应包含一个参数(接收定时器自身对象或关联参数) |
arg | 超时回调函数的参数(可选)。如果提供了 arg,在回调函数中将可以通过传入的参数获取额外信息 |
注意: 硬件定时器 [0-5] 暂不可用
Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)
用于初始化或重新配置定时器的参数。参数与构造函数相同
返回值:
无
Timer.deinit()
释放定时器资源
参数:
无
返回值:
无
from machine import FPIOA
from machine import Timer
from machine import Pin
import time
fpioa = FPIOA()
#设置引脚,使用GPIO功能
fpioa.set_function(62, FPIOA.GPIO62)
fpioa.set_function(20, FPIOA.GPIO20)
fpioa.set_function(63, FPIOA.GPIO63)
#设值引脚对应灯光
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 红色LED
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 绿色LED
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 蓝色LED
#关闭所有灯光
LED_R.high()
LED_G.high()
LED_B.high()
# 定义一个变量记录当前点亮的是哪一种LED
color_state = 0 # 0:红, 1:绿, 2:蓝
#必须带有一个参数
def LED_flicker(timer):
# 执行前关闭之前打开的灯光
LED_R.high()
LED_G.high()
LED_B.high()
#声明为全局变量,即为访问外部全局变量而不是函数内新建一个变量
global color_state
if color_state==0:
LED_R.low() # 点亮红灯
elif color_state==1:
LED_G.low() # 点亮绿灯
elif color_state==2:
LED_B.low() # 点亮蓝灯
#切换颜色
color_state = (color_state + 1)%3
print(color_state)
# 创建软件定时器,index=-1表示软件定时器
tim = Timer(-1)
# 初始化定时器为周期模式,每隔1秒调用一次回调函数
tim.init(period=1000, mode=Timer.PERIODIC, callback=LED_flicker)
#保持程序运行
while True:
time.sleep(1)
实验现象是红绿蓝三种颜色的灯光每隔一秒切换一次
注意回调函数必须要有参数
看门狗复位会导致整个系统全部重启,如果此时连接了CanMV IDE K230,在规定时间未进行喂狗操作时,也会断开与IDE的通讯连接。
K230内部有两个看门狗,目前只能使用WDT1,WDT0 暂时不可以使用。
导入看门狗
from machine import WDT
构造函数
wdt = WDT(id=1, timeout=5)
参数 | 内容 |
---|---|
id | WDT 模块编号,取值范围为 [0, 1],默认为 1 |
timeout | 超时值,单位为秒(s),默认为 5 |
注意: WDT0 暂不可用
WDT.feed()
执行喂狗操作
参数:
无
返回值:
无
# 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源
# 开发板官网:www.lckfb.com
# 技术支持常驻论坛,任何技术问题欢迎随时交流学习
# 立创论坛:www.jlc-bbs.com/lckfb
# 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
# 不靠卖板赚钱,以培养中国工程师为己任
import time
from machine import Pin, FPIOA, WDT
# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()
# 设置引脚功能,将指定的引脚配置为普通GPIO功能
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)
fpioa.set_function(53,FPIOA.GPIO53)
# 实例化Pin62, Pin20, Pin63为输出,分别用于控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 蓝灯
# 按键引脚为53,设为下拉输入:未按下为低电平,按下为高电平
button = Pin(53, Pin.IN, Pin.PULL_DOWN)
# 板载RGB灯是共阳结构,高电平=关,低电平=亮
# 初始化时先关闭所有LED
LED_R.high()
LED_G.high()
LED_B.high()
# 定义LED颜色状态 0=红, 1=绿, 2=蓝
color_state = 0
# 初始化硬件看门狗WDT,通道1, 超时时间10秒
wdt = WDT(1, 10)
# 首先喂一次狗,确保开始有充足时间
wdt.feed()
while True:
# LED轮询:先关全,再亮指定颜色
LED_R.high()
LED_G.high()
LED_B.high()
if color_state == 0:
LED_R.low() # 点亮红灯
elif color_state == 1:
LED_G.low() # 点亮绿灯
elif color_state == 2:
LED_B.low() # 点亮蓝灯
# 切换到下一个颜色状态
color_state = (color_state + 1) % 3
# 检测按钮,如果按下则喂狗
if button.value() == 1:
wdt.feed() # 喂狗,重置WDT计时
print("wdt feed!")
# 简单去抖延时
time.sleep(0.2)
# 每0.5秒切换一次LED颜色
time.sleep(0.5)
# 长时间未喂狗情况:3秒后WDT会超时自动复位
这边直接使用立创官方案例
建议将以上代码通过IDE保存到开发板上,让之上电后就执行(注意:如果你把看门狗的时间设置的太短,会导致你的板子在还未连上电脑IDE前就会重启,导致你无法更换默认运行的代码,此时可以把TF卡重新拿出来刷个新固件),首先利用FPIOA配置GPIO功能脚,驱动RGB共阳LED依次显示红、绿、蓝三色并循环闪烁。同时,通过一个按键(USR用户侧按按钮)进行看门狗(WDT)喂狗操作:在10秒内若没有按下按键喂狗,WDT将触发复位;如果按下按键则喂狗重置计时,确保程序持续运行。
整体流程是:程序上电初始化并启动循环,每隔0.5秒切换LED颜色,若期间检测到按键按下则重置WDT计数,否则在3秒后自动复位,实现对系统的重启。
看门狗(WDT)的主要作用是就是监控系统是否正常运行,并在系统出现异常时触发复位,上面例程并不是真实的使用场景,大家根据自己的时间项目自由设置