【k230基础教程之ADC,RTC,TIMER,WDT】

k230基础教程之ADC,RTC,TIMER,WDT

  • 一,ADC
    • 1.read_u16方法
    • 2.read_uv方法
    • 示例
  • 二,RTC
    • 1.init方法
    • 2.detatime方法
    • 示例
  • 三,TIMER(定时器)
    • 1.init方法
    • 2.deinit方法
    • 软件定时器控制LED灯
  • 四,WDT(看门狗)
    • 1.feed方法
    • 示例

本教程皆来自立创官方教程,为博主学习使用所记录,使用开发板为立创的庐山派,如有需求可自行访问 立创官网
关于这些外设具体介绍不在赘述,直接讲述MicroPython操作的k230用法

一,ADC

首先导入ADC以及构造函数

from machine import ADC

构造函数

adc = ADC(channel)

参数:
channel: 表示要使用的 ADC 通道号
庐山派可用的通道只有四个
【k230基础教程之ADC,RTC,TIMER,WDT】_第1张图片

1.read_u16方法

ADC.read_u16()

获取指定通道的当前采样值

参数:

返回值:
返回该 ADC 通道的采样值,范围为 [0, 4095]

2.read_uv方法

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)

二,RTC

Real-Time Clock 是一种能够提供持续、精确的日期和时间信息的硬件或外设模块,可在系统断电后依然通过备用电源运行,以保持时间不丢失

导入RTC

from machine import RTC

构造函数

rtc = RTC()

1.init方法

rtc.init((year, mon, day, week,hour, min, sec, microsec))
参数 内容
year
mon
day
week 星期几
hour
min
sec
microsec 微秒

参数应该是一个元组,如果缺少括号会报错

返回值:

2.detatime方法

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基础教程之ADC,RTC,TIMER,WDT】_第2张图片

三,TIMER(定时器)

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] 暂不可用

1.init方法

Timer.init(mode=Timer.PERIODIC, freq=-1, period=-1, callback=None, arg=None)

用于初始化或重新配置定时器的参数。参数与构造函数相同

返回值:

2.deinit方法

Timer.deinit()

释放定时器资源

参数:

返回值:

软件定时器控制LED灯

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)

实验现象是红绿蓝三种颜色的灯光每隔一秒切换一次
注意回调函数必须要有参数

四,WDT(看门狗)

看门狗复位会导致整个系统全部重启,如果此时连接了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 暂不可用

1.feed方法

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)的主要作用是就是监控系统是否正常运行,并在系统出现异常时触发复位,上面例程并不是真实的使用场景,大家根据自己的时间项目自由设置

你可能感兴趣的:(【k230基础教程之ADC,RTC,TIMER,WDT】)