发布时间:2026/6/23 15:59:41
江科大PWM笔记:呼吸灯、舵机控制、电机调速
*psc预分频器决定计数脉冲的频率arr自动重装载寄存器决定了多久是一个周期ccr捕获/比较寄存器决定占空比cnt计数器寄存器不能写只能读1在理解呼吸灯原理之前先了解一些基本公式1. 频率公式 PWM频率 定时器时钟频率 / (PSC 1) / (ARR 1)计数频率 定时器输入时钟 / (PSC 1) CCR 乘以计数单位 高电平持续的时间脉宽。 定时器时钟频率和定时器输入时钟都是一个东西表示72MHz2. 占空比公式 占空比 CCR / (ARR 1) × 100% 3. 分辨率公式 分辨率步数 ARR 1注意1000Hz就是1s1000次变化也就是1ms一个周期1s等于1000ms设置ARR,PSC,CCR一些基本的#include stm32f10x.h // Device header void PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); // GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; //GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period 100 - 1; //ARR TIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; //PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; //CCR TIM_OC1Init(TIM2, TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); } void PWM_SetCompare1(uint16_t Compare) { TIM_SetCompare1(TIM2, Compare); }主函数#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include PWM.h uint8_t i; int main(void) { OLED_Init(); PWM_Init(); while (1) { for (i 0; i 100; i) { PWM_SetCompare1(i); Delay_ms(10); } for (i 0; i 100; i) { PWM_SetCompare1(100 - i); Delay_ms(10); } } }实现效果实现逻辑执行PWM_Init函数使pscarrccr初始化执行PWM_SetCompare1修改ccr的值i越高占比就越高也就是慢慢变亮后面i减小也就是慢慢变暗。2在了解为什么可以驱动舵机之前先要知道所以舵机都遵循0.5ms 高电平 → 转到 0°1.5ms 高电平 → 转到 90°2.5ms 高电平 → 转到 180°标准舵机要求控制信号的频率固定为 50Hz设置基本pscarrccr#include stm32f10x.h // Device header void PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period 20000 - 1; //ARR TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1; //PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; //CCR TIM_OC2Init(TIM2, TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); } void PWM_SetCompare2(uint16_t Compare) { TIM_SetCompare2(TIM2, Compare); }设置映射关系#include stm32f10x.h // Device header #include PWM.h void Servo_Init(void) { PWM_Init(); } void Servo_SetAngle(float Angle) { PWM_SetCompare2(Angle / 180 * 2000 500); }SetCompare是得到CCR的值angle等于0时ccr等于500arr固定为2000计数单位为72MHz/721MHz/s即1微秒就是一个计数周期500乘计数单位为高电平持续时间也就是500微秒0.5msangle等于180时ccr等于2000arr固定为2000计数单位为72MHz/721MHz/s即1微秒就是一个计数周期2500乘计数单位为高电平持续时间也就是2500微秒2.5ms主函数逻辑#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Servo.h #include Key.h uint8_t KeyNum; float Angle; int main(void) { OLED_Init(); Servo_Init(); Key_Init(); OLED_ShowString(1, 1, Angle:); while (1) { KeyNum Key_GetNum(); if (KeyNum 1) { Angle 30; if (Angle 180) { Angle 0; } } Servo_SetAngle(Angle); OLED_ShowNum(1, 7, Angle, 3); } }当按下按钮时满足第一个if条件执行Servo_SetAngle函数舵机旋转30度当大于180度时回到0度。实现效果注意舵机不能无限转范围一般是0-180度。3在了解驱动电机之前需要知道1.人听到的永远是PWM的频率通过调整psc和arr使频率在20khz以上人就听不到了。2.oc控制的是引脚输出具体对应关系如下通道对应的 CCR 寄存器对应的 GPIO 引脚默认通道1OC1CCR1PA0通道2OC2CCR2PA1通道3OC3CCR3PA2通道4OC4CCR4PA3PWN文件#include stm32f10x.h // Device header void PWM_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); TIM_InternalClockConfig(TIM2); TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period 100 - 1; //ARR TIM_TimeBaseInitStructure.TIM_Prescaler 36 - 1; //PSC TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; //CCR TIM_OC3Init(TIM2, TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); } void PWM_SetCompare3(uint16_t Compare) { TIM_SetCompare3(TIM2, Compare); }通过修改PSC使PWN频率在20kHz以上硬件模块motor文件#include stm32f10x.h // Device header #include PWM.h void Motor_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); PWM_Init(); } void Motor_SetSpeed(int8_t Speed) { if (Speed 0) { GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_ResetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(Speed); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_4); GPIO_SetBits(GPIOA, GPIO_Pin_5); PWM_SetCompare3(-Speed); } }pp表示推挽输出主动让cpu控制高低电平GPIO_Speed_50MHz表示最高承受上限是50MHz之所以设置成一个高电平另一个低电平就是因为电流方向驱动电机转起来了。主函数部分#include stm32f10x.h // Device header #include Delay.h #include OLED.h #include Motor.h #include Key.h uint8_t KeyNum; int8_t Speed; int main(void) { OLED_Init(); Motor_Init(); Key_Init(); OLED_ShowString(1, 1, Speed:); while (1) { KeyNum Key_GetNum(); if (KeyNum 1) { Speed 20; if (Speed 100) { Speed -100; } } Motor_SetSpeed(Speed); OLED_ShowSignedNum(1, 7, Speed, 3); } }实现逻辑当按下按钮speed加20全局变量未初始化自动赋值为0执行函数Motor_SetSpeed并将相应的引脚置高或低电平并将speed上传至ccr最后显示speed。如果speed超过100启动反转再按下就再加20并一样执行函数Motor_SetSpeed并将相应的引脚置高或低电平并将speed上传至ccr最后显示speed。一些小知识占空比越高转的就越快。这是因为平均电压高。当停的时候由于机械惯性会继续转所以取平均电压占空比越高平均电压越高电流越大速度就越快而呼吸灯是因为人的视觉停留所以占空比高才看出的慢慢变亮再慢慢变暗。实现效果

相关新闻

告别重复操作!OpenClaw 2.7.9 电脑自动化完整落地实操
2026/6/23 15:59:41

告别重复操作!OpenClaw 2.7.9 电脑自动化完整落地实操

🔍一、前言 OpenClaw 是一款备受追捧的高效本地 AI 自动化工具,支持完全离线运行,不依赖外网连接或云端账号绑定,通过智能 AI 逻辑自主操控各类电脑操作。最新 v2.7.9 版本已内置完整运行环境、配套依赖库及多系统适配配置&#…

阅读更多
2026山东大学软件学院项目实训-宠物情绪识别(七)
2026/6/23 15:59:41

2026山东大学软件学院项目实训-宠物情绪识别(七)

一、本周工作概述本周在完成情绪识别 API 调通的基础上,重点对大模型提示词策略进行了系统性研究和优化。核心工作包括:尝试了5种不同的提示词策略、从多维度进行量化评估对比、选择最优方案并完成代码实现、增加后处理验证和降级策略提升系统鲁棒性。二…

阅读更多
光伏组件I-V特性建模与MPPT参数一键计算工具(Matlab/Simulink)
2026/6/23 14:59:40

光伏组件I-V特性建模与MPPT参数一键计算工具(Matlab/Simulink)

本文还有配套的精品资源,点击获取 简介:提供开箱即用的Simulink光伏面板模型(pv_panel.slx)和配套MATLAB参数计算脚本(calcul_valeurs.m),支持基于单二极管等效电路的电压-电流特性仿真。输入…

阅读更多
深度度量学习实战指南:BN-Inception模型的迁移学习与特征提取完整教程
2026/6/23 16:59:41

深度度量学习实战指南:BN-Inception模型的迁移学习与特征提取完整教程

深度度量学习实战指南:BN-Inception模型的迁移学习与特征提取完整教程 【免费下载链接】Deep_Metric Deep Metric Learning 项目地址: https://gitcode.com/gh_mirrors/de/Deep_Metric 深度度量学习是计算机视觉领域的核心技术之一,而Deep_Metri…

阅读更多
为什么选择UnrealEngineSkyAtmosphere?对比主流天空渲染方案的优势分析
2026/6/23 16:59:41

为什么选择UnrealEngineSkyAtmosphere?对比主流天空渲染方案的优势分析

为什么选择UnrealEngineSkyAtmosphere?对比主流天空渲染方案的优势分析 【免费下载链接】UnrealEngineSkyAtmosphere Unreal Engine Sky Atmosphere Rendering Technique 项目地址: https://gitcode.com/gh_mirrors/un/UnrealEngineSkyAtmosphere UnrealEngi…

阅读更多
游戏开发教学革命:Unfinished-asteroids如何模拟真实工作环境加速学习
2026/6/23 16:59:41

游戏开发教学革命:Unfinished-asteroids如何模拟真实工作环境加速学习

游戏开发教学革命:Unfinished-asteroids如何模拟真实工作环境加速学习 【免费下载链接】unfinished-asteroids IT STARTS HERE ---> 项目地址: https://gitcode.com/gh_mirrors/un/unfinished-asteroids Unfinished-asteroids是一个创新的游戏开发教学项目…

阅读更多
Medium Editor Markdown快速入门:5分钟实现富文本到Markdown的实时转换
2026/6/23 16:59:41

Medium Editor Markdown快速入门:5分钟实现富文本到Markdown的实时转换

Medium Editor Markdown快速入门:5分钟实现富文本到Markdown的实时转换 【免费下载链接】medium-editor-markdown :pencil: A Medium Editor extension to add markdown support. 项目地址: https://gitcode.com/gh_mirrors/me/medium-editor-markdown 你是否…

阅读更多
DriveAGI性能优化技巧:大规模驾驶视频处理的7个最佳实践
2026/6/23 16:59:41

DriveAGI性能优化技巧:大规模驾驶视频处理的7个最佳实践

DriveAGI性能优化技巧:大规模驾驶视频处理的7个最佳实践 【免费下载链接】DriveAGI [CVPR 2024 Highlight] GenAD: Generalized Predictive Model for Autonomous Driving 项目地址: https://gitcode.com/gh_mirrors/dr/DriveAGI 想要高效处理1700小时的大规…

阅读更多
08 - 组织生命体:AI时代组织管理深度诊断试卷
2026/6/23 15:59:41

08 - 组织生命体:AI时代组织管理深度诊断试卷

你正坐在会议室里,CTO刚刚汇报完大模型部署的进展——效率提升了42%,成本下降了28%。董事会很满意。但你知道一个他们不知道的数字:核心工程师的主动离职率,在过去两个季度里翻了一倍。 离职面谈的最后一句话像一根刺扎在你心里:“公司越来越像一台完美的机器,而我越来越…

阅读更多
嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南
2026/6/23 3:25:21

嵌入式语音编解码实战:G.726 ADPCM库集成与优化指南

1. 项目概述与G.726 ADPCM技术背景在嵌入式语音处理领域,带宽和存储资源往往是寸土寸金的。如果你做过对讲机、VoIP网关或者早期的数字录音设备,一定对如何在有限的比特率下保住语音可懂度这件事深有感触。我当年接手一个车载调度系统的项目,…

阅读更多
ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性
2026/6/23 4:51:28

ITU656格式化器寄存器配置实战:VBI数据处理与VCR特技播放兼容性

1. 项目概述与核心挑战在数字视频处理领域,将原始的视频数据、同步时序以及各种辅助信息打包成一个标准、稳定的串行数据流,是确保设备间互联互通的基础。ITU-R BT.656标准(常简称为ITU656)正是为此而生的一套“交通规则”。它定义…

阅读更多
嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南
2026/6/23 0:40:11

嵌入式GUI开发实战:emWin环境搭建、配置优化与性能调优指南

1. 项目概述与emWin核心价值解析在嵌入式系统开发领域,人机交互(HMI)的设计正从简单的LED指示灯和按键,快速向全彩图形化界面演进。无论是智能家电上的触摸屏、工业PLC的操作面板,还是医疗设备的参数显示,一…

阅读更多
3分钟快速上手:Qwen3大语言模型本地部署完全指南
2026/6/23 0:59:31

3分钟快速上手:Qwen3大语言模型本地部署完全指南

3分钟快速上手:Qwen3大语言模型本地部署完全指南 【免费下载链接】Qwen1.5 Qwen3 is the large language model series developed by Qwen team, Alibaba Cloud. 项目地址: https://gitcode.com/GitHub_Trending/qw/Qwen1.5 阿里巴巴Qwen3大语言模型系列以其…

阅读更多
微信聊天记录备份指南:使用WeChatExporter轻松保存您的珍贵回忆
2026/6/23 0:59:31

微信聊天记录备份指南:使用WeChatExporter轻松保存您的珍贵回忆

微信聊天记录备份指南:使用WeChatExporter轻松保存您的珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 在数字时代,微信聊天记录承载着我…

阅读更多
Cortex-M指令集深度解析:饱和运算、位域操作与分支控制实战
2026/6/23 0:59:31

Cortex-M指令集深度解析:饱和运算、位域操作与分支控制实战

1. 从指令到效率:为什么Cortex-M指令集值得深挖如果你在嵌入式领域摸爬滚打了一段时间,尤其是跟ARM Cortex-M系列单片机打交道,那你肯定对“写寄存器”、“调库函数”这套流程熟得不能再熟了。但不知道你有没有过这样的感觉:项目代…

阅读更多
GIT修改用户名
2026/6/23 8:19:27

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/22 10:07:50

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/23 6:37:14

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多