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

基于RT-Thread的STM32F4开发第六讲——PWM输出(CH1和CH1N)

文章目录

  • 前言
  • 一、RT-Thread工程创建
  • 二、PWM工作函数编写
    • 1.user_pwm.c
    • 2.user_pwm.h
    • 2.main.h
  • 三、效果展示
  • 四、工程分享


前言

本章是基于RT-Thread studio实现PWM一对互补信号输出,开发板是正点原子的STM32F4探索者,使用的RT-Thread驱动是5.1.0。本章官方驱动文档内容较好,改动地方很少,开发难度小。


一、RT-Thread工程创建

从以前文章得到驱动5.1.0不报错工程,打开cubemx,其他外设配置不多说,定时器配置如下。
在这里插入图片描述
注意,一般设置CH极性与CHN极性相反,这样才能得到一个互补的PWM信号,否则就是同样的PWM信号。一个PWM输出在形式上与它的模式、计数方式和极性有关。如图所示
在这里插入图片描述
CH ldle state与CHN ldle state是设置空闲时两个通道输出电平,一般设置为低电平,防止驱动设备损坏。对于所谓的快速模式(fast mode)我测试了一下,即使是高频率(1M以上)PWM输出,开启快速模式,PWM波形在示波器上没什么变化,不知道作用在哪。

配置好cubemx,生成工程,接下来和前面文章外设一样,按要求STEP x做就行,如图。
这里定义了#define BSP_USING_PWM1_CH1这个不是必须项,可以理解为使能你使用PWM的通道,建议使能。
在这里插入图片描述
进入pwm_config.h,我使用的是定时器1的通道1来输出PWM,文件内原本没有,按同样格式添加就行。
如果上一步没定义#define BSP_USING_PWM1_CH1,那么这里的通道不能选为0,得选择你使用的通道,这样也可以实现效果。不过整个定时器只能使用一个通道了,所以不建议这么操作。
在这里插入图片描述
接着进入drv_pwm.c文件
注意在drv_pwm_get函数和drv_pwm_set函数,仔细看看需编译指令里的芯片型号和定时器有没有你需要的,这些函数都是设置pwm的时钟频率,至关重要。比如说在246句的if判断下原本只有TIM9、TIM10、TIM11,但其实TIM1和TIM8也属于这个其中,都是挂载在APB2上的,我这里使用了TIM1,所以我就加入了TIM1。
在这里插入图片描述
stm32_hw_pwm_init函数就是设置具体的pwm配置了,对照你cubemx生成的pwm配置函数更改即可,可以看到这里的预分频指数和重装数都为0,不建议更改,因为RT-Thread提供了上层函数来更改这些内容。
在这里插入图片描述
后面有个函数pwm_get_channel,如果已开启board.h中没有定义BSP_USING_PWM1_CH1那么这个函数将不可用。建议根据这个函数的预编译指令去定义你需要的通道。

二、PWM工作函数编写

代码逻辑很简单,不解释,看手册就行

1.user_pwm.c

#include "user_pwm.h"#define DBG_TAG "user_pwm"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#define     PWM_NAME    "pwm1"
#define     PWM_CHANNEL     1
#define     PWM_CHANNEL_N     -1
#define     PWM_PERIOD      100000
#define     PWM_PULSE       75000
void pwm_init(void)
{rt_err_t flag;struct rt_device_pwm *pwm1_handle;pwm1_handle = (struct rt_device_pwm *)rt_device_find(PWM_NAME);if(pwm1_handle == RT_NULL){LOG_D("failed to pwm1 handle fine");return;}flag = rt_pwm_set(pwm1_handle, PWM_CHANNEL, PWM_PERIOD, PWM_PULSE);if(flag != RT_EOK){LOG_D("failed to pwm1 CH1 set");return;}flag = rt_pwm_set(pwm1_handle, PWM_CHANNEL_N, PWM_PERIOD, PWM_PULSE);if(flag != RT_EOK){LOG_D("failed to pwm1 CH1N set");return;}flag = rt_pwm_enable(pwm1_handle,PWM_CHANNEL);if(flag != RT_EOK){LOG_D("failed to pwm1 CH1 enable");return;}flag = rt_pwm_enable(pwm1_handle,PWM_CHANNEL_N);if(flag != RT_EOK){LOG_D("failed to pwm1 CH1N enable");return;}
}

2.user_pwm.h

#ifndef APP_USER_PWM_H_
#define APP_USER_PWM_H_#include <board.h>
void pwm_init(void);#endif /* APP_USER_PWM_H_ */

2.main.h

#include <rtthread.h>#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>#include "user_pwm.h"
int main(void)
{pwm_init();while (1){rt_thread_mdelay(1000);}return RT_EOK;
}

三、效果展示

在这里插入图片描述
可以看到通道1(黄)输出了10KHz,75%占空比的PWM正弦波,通道2(绿)输出的相位相反

四、工程分享

通过网盘分享的文件:PWM.zip
链接: https://pan.baidu.com/s/1wOMq_9n68f6Cvkp8re6dXA?pwd=e22r 提取码: e22r


http://www.xdnf.cn/news/566263.html

相关文章:

  • DevOps学习回顾03-ops三部曲之配置管理(CM)
  • C++核心编程_初始化列表
  • Unity3D序列化机制详解
  • 云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)
  • 游戏盾功能与技术解析
  • 电力设备制造企业数字化转型路径研究:从生产优化到生态重构
  • SpringBoot3+Vue3(2)-前端基本页面配置-登录界面编写-Axios请求封装-后端跨越请求错误
  • 【Java高阶面经:微服务篇】4.大促生存法则:微服务降级实战与高可用架构设计
  • 使用计算机视觉实现目标分类和计数!!超详细入门教程
  • uni-app(2):页面
  • 用python实现汉字转拼音工具
  • 【AI News | 20250521】每日AI进展
  • 【Java高阶面经:微服务篇】9.微服务高可用全攻略:从架构设计到自动容灾
  • Ajax快速入门教程
  • OpenCV CUDA模块特征检测与描述------用于创建一个最大值盒式滤波器(Max Box Filter)函数createBoxMaxFilter()
  • PostgreSQL日志维护
  • 阿里云合集(不定期更新)
  • 适合初学者的 Blender 第二部分
  • 1.4 C++之运算符与表达式
  • leetcode hot100刷题日记——8.合并区间
  • java综合交易所13国语言,股票,区块链,外汇,自带客服系统运营级,有测试
  • Circle宣布Circle Payments Network主网上线
  • digitalworld.local: VENGEANCE靶场
  • 网络框架二次封装:基于Kotlin的高扩展性网络请求框架完整实现
  • 网工每日一练
  • 禁止window安全中心乱删文件
  • HarmonyOS基础组件:Button三种类型的使用
  • 百度Q1财报:总营收325亿元超预期 智能云同比增速达42%
  • OceanBase 开发者大会,拥抱 Data*AI 战略,构建 AI 数据底座
  • 开源STM32F429汽车仪表盘基于LVGL界面