江科大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 电脑自动化完整落地实操

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

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

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

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

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

2026/6/23 15:59:57阅读更多 →
pikachu详细通关教程

pikachu详细通关教程

less-1--基于表单的暴力破解先不用登录,用BP抓包丢到Intruder模块并将包中自带参数删除点击password,然后点击Payloads,添加爆破字典点击start attack开始爆破登录成功和失败返回的响应不同,找到不同的长度。2.

2026/6/23 15:59:57阅读更多 →
PowerCLI-Example-Scripts最佳实践:社区脚本的质量控制与维护

PowerCLI-Example-Scripts最佳实践:社区脚本的质量控制与维护

PowerCLI-Example-Scripts最佳实践:社区脚本的质量控制与维护 【免费下载链接】PowerCLI-Example-Scripts 项目地址: https://gitcode.com/gh_mirrors/po/PowerCLI-Example-Scripts PowerCLI-Example-Scripts是VMware PowerCLI的社区脚本集合,提…

2026/6/23 17:05:10阅读更多 →
TextureLab入门教程:10分钟创建你的第一个程序化材质

TextureLab入门教程:10分钟创建你的第一个程序化材质

TextureLab入门教程:10分钟创建你的第一个程序化材质 【免费下载链接】texturelab Free, Cross-Platform, GPU-Accelerated Procedural Texture Generator 项目地址: https://gitcode.com/gh_mirrors/te/texturelab 🎨 TextureLab 是一款免费、跨…

2026/6/23 17:05:10阅读更多 →
CS2303 (原CS356) - 操作系统课程设计

CS2303 (原CS356) - 操作系统课程设计

CS2303 (原CS356) - 操作系统课程设计 【免费下载链接】awesome-cs 👨‍💻 ❤️ 💻 上海交通大学计算机系本科作业参考 项目地址: https://gitcode.com/gh_mirrors/awe/awesome-cs Project 1 - 进程管理 skyzh, 2020 SpringBugenZhao, …

2026/6/23 17:05:10阅读更多 →
如何快速上手MCP-Security-Checklist:初学者完整教程与实战演练

如何快速上手MCP-Security-Checklist:初学者完整教程与实战演练

如何快速上手MCP-Security-Checklist:初学者完整教程与实战演练 【免费下载链接】MCP-Security-Checklist A comprehensive security checklist for MCP-based AI tools. Built by SlowMist to safeguard LLM plugin ecosystems. 项目地址: https://gitcode.com/g…

2026/6/23 17:05:10阅读更多 →
DawnLauncher自定义主题完全指南:打造个性化Windows桌面

DawnLauncher自定义主题完全指南:打造个性化Windows桌面

DawnLauncher自定义主题完全指南:打造个性化Windows桌面 【免费下载链接】DawnLauncher Windows快捷启动工具,帮助您整理杂乱无章的桌面,分门别类管理您的桌面快捷方式,让您的桌面保持干净整洁。 项目地址: https://gitcode.com…

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

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

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

2026/6/23 17:00:09阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/23 7:04:52阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/23 1:55:32阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/23 5:55:37阅读更多 →
2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南

2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan新手必看指南。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流…

2026/6/23 0:00:38阅读更多 →
2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

2026年北京电子沙盘制作公司深度评测:从技术选型到落地效果,谁在真正定义“数字+实体”的融合边界?

模块一:行业背景——百亿赛道爆发,北京市场的特殊性与选型困局2026年,电子沙盘行业已走过“要不要做”的讨论,进入“找谁做、怎么做”的深水区。据行业研究机构数据,2025年国内电子沙盘市场规模已突破85亿元&#xff0…

2026/6/23 0:00:38阅读更多 →
音视频场景下的 Java 开发者面试:技术与挑战

音视频场景下的 Java 开发者面试:技术与挑战

面试互联网大厂:从音视频场景看 Java 开发者的技能与挑战 在互联网大厂求职的面试中,Java 开发者往往需要面对严苛的技术问题。今天,我们将通过一位名叫燕双非的搞笑程序员与严肃的面试官之间的对话,看看在音视频场景下&#xff0…

2026/6/23 0:00:38阅读更多 →