当前位置: 首页 > 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;
}

相关文章:

rt-thread pwm 多通道

一通道pwm参考 https://blog.csdn.net/yangshengwei230612/article/details/128738351?spm1001.2014.3001.5501 以下主要是多通道与一通道的区别 芯片 stm32f407rgt6 1、配置PWM设备驱动相关宏定义 添加PWM宏定义 #define BSP_USING_PWM8 #define BSP_USING_PWM8_CH1 #d…...

C语言练习 | 初学者经典练习汇总

目录 1、下面代码输出多少&#xff0c;为什么&#xff1f; 2、你要好好学习么&#xff1f; 3、一直写代码&#xff0c; 4、两个数求最大值 5、输入1-5输出工作日&#xff0c;输入6-7输出休息日&#xff0c;其他输入错误 6、写一个输入密码的代码 7、怎么样当输入数字时候…...

华为OD机试 - 自动曝光(Python) | 机试题算法思路 【2023】

最近更新的博客 华为OD机试 - 卡片组成的最大数字(Python) | 机试题算法思路 华为OD机试 - 网上商城优惠活动(一)(Python) | 机试题算法思路 华为OD机试 - 统计匹配的二元组个数(Python) | 机试题算法思路 华为OD机试 - 找到它(Python) | 机试题算法思路 华为OD机试…...

「6」线性代数(期末复习)

&#x1f680;&#x1f680;&#x1f680;大家觉不错的话&#xff0c;就恳求大家点点关注&#xff0c;点点小爱心&#xff0c;指点指点&#x1f680;&#x1f680;&#x1f680; 目录 第五章 相似矩阵及二次型 &2&#xff09;方阵的特征值与特征向量 &3&#xff…...

1.1 硬件与micropython固件烧录及自编译固件

1.ESP32硬件和固件 淘宝搜ESP32模块,20-50元都有,自带usb口,即插即用. 固件下载地址:MicroPython - Python for microcontrollers 2.烧录方法 为简化入门难度,建议此处先使用带GUI的开发工具THonny,记得不是给你理发的tony老师. 烧录的入口是: 后期通过脚本一次型生成和烧…...

【MySQL进阶】视图 存储过程 触发器

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

[Linux篇] Linux常见命令和权限

文章目录使用XShell登录Linux1.Linux常用基本命令&#xff1a;1.1 ls&#xff08;列出当前的目录下都有哪些文件和目录&#xff09;1.2 cd (change directory 切换目录)1.3 pwd&#xff08;查看当前目录的绝对路径&#xff09;1.4 touch&#xff08;创建文件&#xff09;1.5 ca…...

29岁从事功能测试被辞,面试2个月都找不到工作吗?

最近一个28岁老同学联系我&#xff0c;因为被公司辞退&#xff0c;找我倾诉&#xff0c;于是写下此文。 他是14年二本毕业&#xff0c;在我的印象里人特别懒&#xff0c;不爱学习&#xff0c;专业不好&#xff0c;毕业前因为都没找到合适工作&#xff0c;直接去创业了&#xf…...

【C#个人错题笔记1】

观前提醒 记录一些我不会或者少见的内容&#xff0c;不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…...

基于lambda的mongodb查询插件

需求背景需要一个像mybatis plus 一样的基于lambda, 且面向对象的查询mongo数据的插件。在网上找了很久&#xff0c;没有发现有类似功能的插件。于是自己手写了一个&#xff0c;借助mongoTemplate屏蔽了底层查询语句的实现细节。在此基础上&#xff0c;实现了查询的统一封装。技…...

基于微信小程序的微信社团小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…...

GEE学习笔记 七十三:【GEE之Python版教程七】静态展示影像和动态展示影像

我们使用GEE在线编辑可以直接通过在线的网页可以加载展示我们计算的结果&#xff0c;而python版的GEE要展示我们的计算结果可能就比较麻烦。如果有同学看过GEE的python版API中可以找到一个类ee.mapclient&#xff0c;这个类的介绍是它是GEE官方通过Tk写的一个加载展示地图的类。…...

PGLBox全面解决图训练速度、成本、稳定性、复杂算法四大问题!

图神经网络&#xff08;Graph Neural Network&#xff0c;GNN&#xff09;是近年来出现的一种利用深度学习直接对图结构数据进行学习的方法&#xff0c;通过在图中的节点和边上制定聚合的策略&#xff0c;GNN能够学习到图结构数据中节点以及边内在规律和更加深层次的语义特征。…...

超详细的 pytest 教程(一)使用入门篇

前言 pytest到目前为止还没有翻译的比较好全面的使用文档&#xff0c;很多英文不太好的小伙伴&#xff0c;在学习时看英文文档还是很吃力。本来去年就计划写pytest详细的使用文档的&#xff0c;由于时间关系一直搁置&#xff0c;直到今天才开始写。本文是第一篇&#xff0c;主…...

二叉树理论基础知识点

二叉树的种类 在我们解题过程中二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 如图所示&#xff1a; 这…...

【算法基础】堆⭐⭐⭐

一、堆 1. 堆的概念 堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: (1)堆中某个结点的值总是不大于或不小于其父结点的值; (2)堆总是一棵完全二叉树。 将根结点最大的堆叫做最大堆或大根堆,根结点…...

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测

时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测 目录时序预测 | MATLAB实现CNN-SVM卷积支持向量机时间序列预测预测效果基本介绍研究回顾程序设计参考资料预测效果 基本介绍 CNN-SVM预测模型将深度学习模型作为特征学习器&#xff0c;将SVM 支持向量机 作为训练器进行…...

【TypeScrip】TypeScrip的任意类型(Any 类型 和 unknown 顶级类型):

文章目录一、安转依赖&#xff1a;【1】nodejs 环境执行ts【2】使用ts-node二、Any 类型 和 unknown 顶级类型【1】没有强制限定哪种类型&#xff0c;随时切换类型都可以 我们可以对 any 进行任何操作&#xff0c;不需要检查类型【2】声明变量的时候没有指定任意类型默认为any【…...

智能洗地机什么牌子好?智能洗地机排行

要说家庭清洁热门的产品&#xff0c;洗地机肯定首当其冲&#xff0c;集洗吸拖为一体的清洁工具&#xff0c;省时又省力&#xff0c;可谓是家里清洁好助手&#xff0c;今天笔者就为大家介绍几款重量轻、噪音轻、拖地干净的洗地机! 一、CEYEE希亦T800洗地机 在国内&#xff0c;洗…...

【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)

文章目录今日任务1.链表理论基础&#xff08;1&#xff09;什么是链表&#xff1f;&#xff08;2&#xff09;链表的类型&#xff08;3&#xff09;链表的存储方式&#xff08;4&#xff09;链表的定义&#xff08;5&#xff09;链表的操作&#xff08;6&#xff09;性能分析2.…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...