当前位置: 首页 > news >正文

rt-thread pwm 多通道

一通道pwm参考
https://blog.csdn.net/yangshengwei230612/article/details/128738351?spm=1001.2014.3001.5501

以下主要是多通道与一通道的区别

芯片

stm32f407rgt6

1、配置PWM设备驱动相关宏定义

添加PWM宏定义

#define BSP_USING_PWM8
#define BSP_USING_PWM8_CH1
#define BSP_USING_PWM8_CH2

在这里插入图片描述

2.添加配置的TIM和PWM设备硬件驱动代码

使用STM32CubeIDE 生成 TIM 和 PWM驱动代码
2.1 使用STM32官方STM32CubeIDE配置TIM8 PWM CH1通道(即PI5)
定时器8:TIM8_CH1复用PI5
定时器8:TIM8_CH2复用PI6
在这里插入图片描述
使用外部高速时钟
在这里插入图片描述
配置时钟频率
在这里插入图片描述
设置生生成项目名称
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将红框内的相关驱动代码拷贝到rt-thread pwm测试项目中的 drivers/drv_pwm.c 源文件在这里插入图片描述

2.3复制驱动代码

将上面keil中红框内的相关驱动代码拷贝到rt-thread pwm测试项目中的 drivers/drv_pwm.c 源文件
在这里插入图片描述
修改pwm_config.h文件
如果没有对应pwm配置则添加

#ifdef BSP_USING_PWM8
#ifndef PWM8_CONFIG
#define PWM8_CONFIG                             \{                                           \.tim_handle.Instance     = TIM8,         \.name                    = "pwm8",       \.channel                 = 0             \}
#endif /* PWM5_CONFIG */
#endif /* BSP_USING_PWM8 */

在这里插入图片描述

4、创建线程 PWM 驱动

4.1 具体线程测试代码如下

/** Copyright (c) 2006-2023, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2023-01-19     RT-Thread    first version*/#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#include <rtdevice.h>
#define PWM_DEV_NAME        "pwm8" /* PWM设 备 名 称 */
#define PWM_DEV_CHANNEL_1     1/* PWM通 道 */
#define PWM_DEV_CHANNEL_2    2 /* PWM通 道 */struct rt_device_pwm *pwm_dev; /* PWM设 备 句 柄 */static void pwm_led_thread_entry(void *parameter)
{rt_uint32_t period, pulse, dir, max_period;period = 250000; /* 周 期 为0.5ms, 单 位 为 纳 秒ns */dir = 1; /* PWM脉 冲 宽 度 值 的 增 减 方 向 */pulse = period/2; /* PWM脉 冲 宽 度 值, 单 位 为 纳秒ns */max_period = 500000;/* 查 找 设 备 */pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);if (pwm_dev == RT_NULL){rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);return RT_ERROR;}rt_kprintf("pwm sample run ! find %s device!\n", PWM_DEV_NAME);/* 设 置PWM周 期 和 脉 冲 宽 度 默 认 值 */rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_1, period, pulse);/* 使 能 设 备 */rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL_1);while (0){rt_thread_mdelay(50);if (dir){period += 500; /* 从0值 开 始 每 次 增加5000ns */}else{period -= 500; /* 从 最 大 值 开 始 每 次减 少5000ns */}if (period >= max_period  ){dir = 0;// period = 500000;}if (period <= 250000){dir = 1;// period = 250000;}pulse = period/2;/* 设 置PWM周 期 和 脉 冲 宽 度 */rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_1, period, pulse);}
}static int pwm_led_init(void)
{static rt_thread_t tid_pwmled = RT_NULL;rt_err_t ret = RT_EOK;/* 创建 serial 线程 */tid_pwmled = rt_thread_create("t_pwmled",pwm_led_thread_entry, RT_NULL, 512, 24, 10);/* 创建成功则启动线程 */if (tid_pwmled != RT_NULL){rt_thread_startup(tid_pwmled);}else{ret = RT_ERROR;}return ret;}//ch2
static void pwm_ch2_thread_entry(void *parameter)
{rt_uint32_t period, pulse, dir, max_period;period = 250000; /* 周 期 为0.5ms, 单 位 为 纳 秒ns */dir = 1; /* PWM脉 冲 宽 度 值 的 增 减 方 向 */pulse = period/2; /* PWM脉 冲 宽 度 值, 单 位 为 纳秒ns */max_period = 500000;/* 查 找 设 备 */pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);if (pwm_dev == RT_NULL){rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);return RT_ERROR;}rt_kprintf("pwm sample run ! find %s device!\n", PWM_DEV_NAME);/* 设 置PWM周 期 和 脉 冲 宽 度 默 认 值 */rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_2, period, pulse);/* 使 能 设 备 */rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL_2);while (0){rt_thread_mdelay(50);if (dir){period += 500; /* 从0值 开 始 每 次 增加5000ns */}else{period -= 500; /* 从 最 大 值 开 始 每 次减 少5000ns */}if (period >= max_period  ){dir = 0;// period = 500000;}if (period <= 250000){dir = 1;// period = 250000;}pulse = period/2;/* 设 置PWM周 期 和 脉 冲 宽 度 */rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL_2, period, pulse);}
}static int pwm_ch2_init(void)
{static rt_thread_t tid_pwmled = RT_NULL;rt_err_t ret = RT_EOK;/* 创建 serial 线程 */tid_pwmled = rt_thread_create("t_pwmled",pwm_ch2_thread_entry, RT_NULL, 512, 24, 10);/* 创建成功则启动线程 */if (tid_pwmled != RT_NULL){rt_thread_startup(tid_pwmled);}else{ret = RT_ERROR;}return ret;}int main(void)
{int count = 1;//初始化pwmpwm_led_init();pwm_ch2_init();while (count++){LOG_D("Hello RT-Thread!");rt_thread_mdelay(1000);}return RT_EOK;
}
http://www.lryc.cn/news/11403.html

相关文章:

  • C语言练习 | 初学者经典练习汇总
  • 华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】
  • 「6」线性代数(期末复习)
  • 1.1 硬件与micropython固件烧录及自编译固件
  • 【MySQL进阶】视图 存储过程 触发器
  • [Linux篇] Linux常见命令和权限
  • 29岁从事功能测试被辞,面试2个月都找不到工作吗?
  • 【C#个人错题笔记1】
  • 基于lambda的mongodb查询插件
  • 基于微信小程序的微信社团小程序
  • GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像
  • PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!
  • 超详细的 pytest 教程(一)使用入门篇
  • 二叉树理论基础知识点
  • 【算法基础】堆⭐⭐⭐
  • 时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测
  • 【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):
  • 智能洗地机什么牌子好?智能洗地机排行
  • 【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)
  • 山东大学软件学院面向对象简答题整理【个人向】
  • JAVA时间类及JAVA8新时间类
  • ASEMI代理FGH60N60SFD,安森美FGH60N60SFD原装IGBT
  • 【云原生之Docker实战】使用dokcer部署web端vscode
  • Docker安装Tomcat、mysql、redis
  • 【python 基础篇 八】python的常用数据类型操作-------集合
  • Spring框架中问题补充
  • 【Leedcode】顺序表必备的三道面试题(附图解)
  • SOFA Weekly|开源人、本周贡献 issue 精选
  • 2023美赛 ICM E题详细版思路
  • 【LeetCode】剑指 Offer(3)