85浏览
查看: 85|回复: 2

[项目] 【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时

[复制链接]
【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图2

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。


【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图1

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图3

驴友花雕  高级技神
 楼主|

发表于 2025-11-3 16:26:32

【花雕动手做】CanMV K230 AI视觉识别模块之使用定时器...

定时器是一种用于精确控制时间和计数的电子装置,广泛应用于单片机系统、工业控制、通信协议管理等领域。以下是关于定时器的详细介绍:
一、核心概念与本质
• 定义
◦ 定时器本质上是对周期性脉冲信号进行计数的装置,通过统计固定频率的脉冲数量实现定时功能。
• 与计数器的关系
◦ 定时器是计数器的特例,区别在于输入信号类型:定时器使用周期固定的内部时钟(如MCU外设时钟),而计数器处理周期不确定的外部脉冲(如I/O引脚信号)。

二、工作原理
• 计数单元
◦ 定时器的核心是一个寄存器,其位数决定了最大计数值(如16位定时器最大计数值为65535)。
• 时钟源与分频
◦ 定时器通过预分频模块调整计数时钟频率,例如将100MHz的TIM CLK分频为1MHz的CK_CNT,以适配不同的定时范围。
• 自动重载机制
◦ 当计数器达到预设终值(ARR寄存器)时,会自动重置初值并触发中断或事件,实现循环定时。

三、分类与功能特性
• 基本定时器
◦ 仅具备基础定时/计数功能,常用于生成时基信号。
• 通用定时器
◦ 集成多路捕获/比较通道,支持PWM输出、输入捕获等功能,适用于电机控制等场景。
• 高级定时器
◦ 增加互补信号输出、死区控制等特性,满足工业级高精度需求。

四、应用场景
• 时间管理
◦ 实现延时控制、周期性任务调度,如LED闪烁、传感器数据采集。
• 通信协议支持
◦ 在Modbus、SIP等协议中用于帧同步检测和超时重传,保障通信可靠性。
• 测量与控制
◦ 通过输入捕获功能测量信号频率或脉宽,或生成PWM波驱动电机。
总之,定时器作为嵌入式系统的核心组件,通过硬件计数与灵活配置实现精准的时间管理。其设计需平衡精度、功耗与实时性,具体实现方式因应用场景而异。

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图2

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图1

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图3

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2025-11-3 16:36:44

【花雕动手做】CanMV K230 AI视觉模块之定时器计时

K230 内部包含 6 个 Timer 硬件模块,最小定时周期为 1 微秒。通过这些定时器,可以实现精确的定时和周期性任务。
实验分别设定一个单次定时器和一个周期定时器,单次定时器只会触发一次回调函数,而周期定时器则会在程序进行的过程中,按照设定的周期时长不断地执行回调函数。

项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用定时器计时         
  2. # 项目功能:演示硬件定时器的使用,包括单次定时和周期定时两种模式
  3. # 导入定时器模块和时间模块
  4. from machine import Timer  # 硬件定时器模块,提供精确的定时功能
  5. import time  # 提供基础的延时功能
  6. def timer_callback_once(t):
  7.     """
  8.     单次定时器回调函数
  9.     One-shot timer callback function
  10.    
  11.     参数说明 | Parameters:
  12.     t: 触发回调的定时器对象 | Timer object that triggered the callback
  13.    
  14.     功能特点 | Features:
  15.     - 只执行一次后自动停止
  16.     - 适用于延时执行特定任务
  17.     - 常用于初始化、单次事件触发等场景
  18.     """
  19.     print("单次定时器触发了! Single shot timer triggered!")
  20.     print("  此消息只会显示一次 | This message will only appear once")
  21. def timer_callback_periodic(t):
  22.     """
  23.     周期性定时器回调函数
  24.     Periodic timer callback function
  25.    
  26.     参数说明 | Parameters:
  27.     t: 触发回调的定时器对象 | Timer object that triggered the callback
  28.    
  29.     功能特点 | Features:
  30.     - 按照固定周期重复执行
  31.     - 适用于需要定期执行的任务
  32.     - 常用于数据采集、状态监测、控制循环等
  33.     """
  34.     # 获取当前时间戳,精确到毫秒
  35.     current_time = time.ticks_ms()
  36.     print("周期定时器触发了! Periodic timer triggered!")
  37.     print(f"  时间戳: {current_time} ms | Timestamp: {current_time} ms")
  38. try:
  39.     # 实例化一个软定时器(虚拟定时器)
  40.     # Initialize a virtual timer
  41.     # 参数说明 | Parameters:
  42.     # -1: 表示使用虚拟定时器(软件实现),不占用硬件定时器资源
  43.     # 其他选项:0,1,2... 表示使用特定的硬件定时器
  44.     timer = Timer(-1)
  45.     print("定时器实例创建成功 | Timer instance created successfully")
  46.     # ==================== 单次定时器演示 ====================
  47.     # ==================== One-shot Timer Demo ====================
  48.    
  49.     # 配置单次模式定时器,周期为100ms
  50.     # Configure one-shot timer with 100ms period
  51.     print("\n--- 启动单次定时器 --- | --- Starting One-shot Timer ---")
  52.     timer.init(period=100,              # 定时周期:100毫秒
  53.               mode=Timer.ONE_SHOT,      # 模式:单次触发
  54.               callback=timer_callback_once)  # 回调函数
  55.    
  56.     print("单次定时器已启动,100ms后触发 | One-shot timer started, will trigger after 100ms")
  57.    
  58.     # 等待单次定时器触发完成
  59.     # Wait for one-shot timer to complete
  60.     # 等待200ms确保单次定时器有足够时间触发
  61.     time.sleep(0.2)
  62.     print("单次定时器测试完成 | One-shot timer test completed")
  63.     # ==================== 周期定时器演示 ====================
  64.     # ==================== Periodic Timer Demo ====================
  65.    
  66.     # 配置周期模式定时器,频率为1Hz(周期1秒)
  67.     # Configure periodic timer with 1Hz frequency (1 second period)
  68.     print("\n--- 启动周期定时器 --- | --- Starting Periodic Timer ---")
  69.     timer.init(freq=1,                  # 频率:1Hz (等同于period=1000ms)
  70.               mode=Timer.PERIODIC,      # 模式:周期触发
  71.               callback=timer_callback_periodic)  # 回调函数
  72.    
  73.     print("周期定时器已启动,每秒触发一次 | Periodic timer started, will trigger every second")
  74.     print("将运行4秒,预期触发4次 | Will run for 4 seconds, expected to trigger 4 times")
  75.     # 让周期定时器运行4秒
  76.     # Let periodic timer run for 4 seconds
  77.     # 在此期间,定时器回调函数会每秒执行一次
  78.     start_time = time.time()
  79.     time.sleep(4)
  80.     end_time = time.time()
  81.     print(f"周期定时器运行结束,实际运行时间: {end_time - start_time:.2f} 秒")
  82.     print(f"Periodic timer finished, actual runtime: {end_time - start_time:.2f} seconds")
  83. except Exception as e:
  84.     # 异常处理:捕获并显示定时器操作过程中的任何错误
  85.     # Exception handling: Catch and display any errors during timer operations
  86.     print(f"定时器操作出错 | Error occurred: {e}")
  87.     print("可能的原因 | Possible reasons:")
  88.     print("  - 定时器资源已被占用 | Timer resource already in use")
  89.     print("  - 参数设置超出范围 | Parameter out of range")
  90.     print("  - 硬件定时器不可用 | Hardware timer not available")
  91. finally:
  92.     # 释放定时器资源(无论是否发生异常都会执行)
  93.     # Release timer resources (executed regardless of exceptions)
  94.    
  95.     # deinit()方法的重要作用:
  96.     # - 停止定时器计数
  97.     # - 释放硬件资源
  98.     # - 取消回调函数注册
  99.     # - 避免资源泄漏
  100.     timer.deinit()
  101.     print("\n定时器资源已释放 | Timer deinitialized")
  102.     print("程序正常结束 | Program finished normally")
  103. """
  104. === 定时器技术详解 ===
  105. 1. 定时器类型:
  106.    - 硬件定时器:精度高,不占用CPU,数量有限
  107.    - 虚拟定时器:软件实现,精度稍低,数量无限制
  108. 2. 定时模式:
  109.    - ONE_SHOT: 单次模式,触发一次后自动停止
  110.    - PERIODIC: 周期模式,按固定间隔重复触发
  111. 3. 参数配置方式:
  112.    - period: 以毫秒为单位设置周期
  113.    - freq: 以赫兹为单位设置频率
  114.    注意:period和freq是互斥的,只能使用其中一个
  115. 4. 精度考虑:
  116.    - 硬件定时器:微秒级精度
  117.    - 虚拟定时器:毫秒级精度,受系统负载影响
  118. === 预期执行结果 ===
  119. 1. 创建定时器实例
  120. 2. 启动单次定时器,100ms后触发一次回调
  121. 3. 等待200ms确保单次定时完成
  122. 4. 启动周期定时器,每秒触发一次回调
  123. 5. 运行4秒,周期定时器触发约4次
  124. 6. 释放定时器资源,程序结束
  125. 实际输出示例:
  126. 定时器实例创建成功
  127. --- 启动单次定时器 ---
  128. 单次定时器已启动,100ms后触发
  129. 单次定时器触发了! Single shot timer triggered!
  130. 单次定时器测试完成
  131. --- 启动周期定时器 ---
  132. 周期定时器已启动,每秒触发一次
  133. 周期定时器触发了! 时间戳: 123456 ms
  134. 周期定时器触发了! 时间戳: 123456 ms
  135. 周期定时器触发了! 时间戳: 123456 ms
  136. 周期定时器触发了! 时间戳: 123456 ms
  137. 周期定时器运行结束,实际运行时间: 4.00 秒
  138. 定时器资源已释放
  139. 程序正常结束
  140. """
复制代码


代码解读:
1. 资源管理:定时器是系统稀缺资源,使用后必须通过deinit()释放
2. 模式选择:
◦ ONE_SHOT:适合延时任务、超时控制
◦ PERIODIC:适合周期性数据采集、控制循环
3. 精度权衡:硬件定时器精度高但数量有限,虚拟定时器灵活但精度低
4. 回调函数:在中断上下文中执行,应保持简短,避免阻塞操作
5. 参数配置:period(毫秒)和freq(赫兹)是设置定时周期的两种方式
这个示例完整展示了嵌入式系统中定时器的典型使用方法,是实时系统编程的基础技能。

实验串口返回情况

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图1

【花雕动手做】CanMV K230 AI视觉模块之使用定时器计时图2

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail