[019] [STM32] 利用定时器输出比较模式的翻转功能实现不同占空比和频率的PWM输出

2023-05-16

STM32
Contents
原理概述
CubeMX配置
HAL库编程实现

MCU型号:STM32F103RCT6

1 原理概述

利用定时器输出比较模式的翻转功能来输出PWM,即当CNT计数到CCR时,翻转一次OCx电平:

image-20220404202522222

注意不能使能输出比较预装载功能,否则向CCR寄存器写入值是不会立即生效,需要等待下次更新事件触发时才生效。

2 CubeMX配置

配置TIM3_CH1通道:

image-20220404202736085

  • 选择TIM_CLK为内部时钟源(pclk2),同时设置CH1通道为输出比较模式
  • 将PSC设为71,即用1M频率去计数
  • 自动重装载值ARR设为最大
  • 输出比较模式设为翻转模式
  • Pulse即CRR寄存器值,默认为0即可,后面软件编程修改
  • Output compare preload输出比较预装载:disable(修改CCR值立即生效)

使能定时器中断:

image-20220404203242519

3 HAL库编程实现

  • 设置输出频率和占空比
uint16_t period_val, duty_val;
void compare_pwm_set(uint32_t freq, uint8_t duty)
{
	period_val = 1000000 / freq;
	duty_val = period_val * duty / 100;
	htim3.Instance->CCR1 = period_val;
}
  • 输出比较回调函数
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint8_t pwm_flag = 1;
	if (htim == &htim3)
	{
		if (pwm_flag)
			htim3.Instance->CCR1 += duty_val;
		else
			htim3.Instance->CCR1 += period_val - duty_val;
		pwm_flag = !pwm_flag;
	}
}

第一次进入输出比较回调函数时,由于定时器翻转前的电平为电平,因此会翻转为高电平,因此先将CCR1 寄存器值设为脉宽值,即高电平持续时间

第二次进入输出比较回调函数时,将先前的高电平翻转为低电平,因此将CCR1值设为period_val - duty_val,即低电平持续时间

  • 启动定时器输出比较功能
int main(void)
{
	[...]
    MX_TIM3_Init();
	compare_pwm_set(100000, 30);
	HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1);
    while (1)
    {
    }
}

测试结果:

image-20220404204808011

周期10us换算为频率即为100000HZ。

注意:由于最大计数频率为1MHZ,此时100KHZ的频率已为极限值,因为period_val为10,即此时占空比的精度已达到了10%,对于不能被10整除的占空比已无法实现了。

period_val = 1000000 / freq
duty_val = period_val * duty / 100

例如将占空比修改为35%compare_pwm_set(100000, 35)

image-20220404205253341

最终结果还是30%。

如果需要再提高频率,可以减小PSC数值,把计数频率提上去。

END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[019] [STM32] 利用定时器输出比较模式的翻转功能实现不同占空比和频率的PWM输出 的相关文章

  • ros底盘驱动包存在scan跟不上车体运行的错误调试过程

    现象描述 一个和底盘通讯的代码和ros包 总是发现当控制车体运行一段距离 rviz里面scan的数据更新会过一秒才能跟着运动走 同时发现tf的base link也是过一秒才更新 调试过程 起初 以为是串口堵塞 没有及时的接受和处理底盘上行发
  • 变频器电路原理详解经典

    要想做好变频器维修 xff0c 当然了解变频器基础知识是相当重要的 xff0c 也是迫不及待的 下面我们就来分享一下变频器维修基础知识 大家看完后 xff0c 如果有不正确地方 xff0c 望您指正 xff0c 如果觉得还行支持一下 xff
  • UART模块验证-面试总结

    前言 本篇博客依旧针对UART模块的验证项目进行面试总结 xff0c 也是笔者面试过众多公司所总结整理的 关于UART深挖的可问的知识点还是非常多 xff0c 本篇博文可以说基本上涵盖大部分可问到的点 关于下列有一些问题我并没有列出答案 x
  • 你所不知道的C语言——链表内是否有环(龟兔赛跑算法)

    判断链表中是否有环 xff0c 这也是力扣的题 xff1a 141 Linked List Cycle 142 Linked List Cycle II 146 LRU缓存 不多比比 xff0c 直接上代码 xff1a 变量 mu 指的是
  • 古诗文本自动生成唐诗文本生成(算例代码)

    首先准备好一个本地文件 xff0c 在此我命名为唐诗三百首 txt如下图 https img blog csdnimg 图片 代码如下 span class token keyword import span numpy span clas
  • __attribute__ 你知多少?

    GNU C 的一大特色就是 attribute 机制 attribute 可以设置函数属性 xff08 Function Attribute xff09 变量属性 xff08 Variable Attribute xff09 和类型属性 x
  • ChatGPT被淘汰了?Auto-GPT到底有多强

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 说Auto GPT淘汰了ChatGPT了 xff0c 显然是营销文案里面的标题党 毕竟它还是基于ChatGPT的API xff0
  • Word+ChatGPT,一分钟完成周报总结作文

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 xff1a keeepdance xff0c 备注 xff1a chatgpt xff0c 拉你进群 Office 的办公软
  • 两分钟速览谷歌2023IO大会:AI军备竞争,全线出击

    大家好 xff0c 我是可夫小子 xff0c 关注AIGC 读书和自媒体 解锁更多ChatGPT AI绘画玩法 加 xff1a keeepdance xff0c 备注 xff1a chatgpt xff0c 拉你进群 5月10日周三 xff
  • 科大讯飞星火认知大模型:诚意满满、全村希望

    近日 xff0c 科大讯飞召开了星火认知大模型成果发布会 xff0c 会上表示讯飞星火大模型将突破开放式问答 xff0c 对标ChatGPT xff0c 在中文能力上超过ChatGPT xff0c 在英文能力上与ChatGPT相当 对此 x
  • Android NDK tombstone分析工具

    Android NDK tombstone分析工具 在Andoird Native库发生异常的时候 xff0c Linux会发生不同级别的sig xff0c 来结构相关进程的运行 xff0c 同时会产生tombstone trace文件用于
  • 关于UEFI

    最近在Thinkpad上安装Ubuntu12 04的时候 xff0c 经历了几个问题 xff0c 发现BOIS里多了很多选项 xff0c 而且安装双系统也有UEFI有关 xff0c 在网站上找了一篇文章 xff0c 发现这还是一个新概念 x
  • 怎样在github上协同开发

    描述 xff1a How to co work wither parter via github Github协同开发情景模拟 Github不仅有很多开源的项目可以参考 xff0c 同样也是协同开发的最佳工具 xff0c 接下来的就模拟一下
  • Android libdvm.so 与 libart.so

    Android libdvm so 与 libart so 系统升级到5 1之后 xff0c 发现system lib 下面没有libdvm so了 xff0c 只剩下了libart so 对于libart模式 xff0c 从4 4就在De
  • 链表快速排序quick-sort(递归+迭代)

    递归版 直接上代码 span class token keyword static span span class token keyword void span span class token function list qsort s
  • 反向代理--解决跨域问题

    为什么要解决跨域问题 xff1a 因为浏览器有限制 xff0c 只有同域名同端口号下的数据才能拿来用 xff1b 那如果想拿到不同域名不同端口号下的数据就不行了 xff1b 在单文件组件中如何去解决跨域问题 xff1a 因为服务器没有跨域限
  • 写在2011

    很早就想写点东西了 xff0c 可晃荡晃荡地就到了2011年最后一刻 我想是要写点东西了 2011年 xff0c 我有太多的感触 这一年是我第一次在异地迎接农历新年了 xff0c 对 xff0c 当时的感觉很刺激 xff0c 刺激得让我和当
  • Translate Aticle

    最近在Thinkpad上安装Ubuntu12 04的时候 xff0c 经历了几个问题 xff0c 发现BOIS里多了很多选项 xff0c 而且安装双系统也有UEFI有关 xff0c 在网站上找了一篇文章 xff0c 发现这还是一个新概念 x
  • Window64位系统用HSDIS对java代码进行反编译

    1 下载hsdis amd64 dll文件并放入 JAVA HOME jre bin中 xff0c 例如 xff1a C Program Files Java jdk1 8 0 191 jre bin 书上说的是放在 JAVA HOME j
  • golang中的context

    一 Context含义 1 context定义 context是golang中的上下文 goroutine的相关环境快照 xff0c 其中包含函数调用以及涉及的相关的变量值 golang通过Context机制解决一个request中多个go

随机推荐