目录

1 PWM信号

1.1 三个最基本的量

1.1.1 周期 T(Period)

1.1.2脉冲宽度 Th(High Time)

1.1.3占空比 D(Duty Cycle)

1.2 为什么要用 PWM

1.3 关键参数对照表

1.4单片机里产生 PWM 的四种套路

1.4.1 纯软件延时

1.4.2 定时器中断计数

1.4.3 定时器硬件 PWM 模块

1.4.4 专用 PWM IC 或驱动板

1.5 计算示例(AT89C52,12 MHz,定时器 0 模式 1)

1.6 常见踩坑提醒

1.7 一句话总结

2 AT89C52单片机实现舵机控制

2.1 舵机专用 PWM(50 Hz)

2.2 电路原理图

2.3 控制程序

3 AT89C52单片机实现直流电机控制

3.1L298N电机驱动

3.1.1它到底是什么

3.1.2引脚速记

3.1.3控制逻辑真值表(电机 A 为例)

3.1.4 AT89C52 示例代码(定时器 0 产生 1 kHz PWM)

3.1.5 常见坑 & 快速排查

3.2 单片机实现直流电机控制电路原理图

3.3 单片机实现直流电机控制控制程序


摘要:本文系统介绍了PWM技术原理及其在舵机和直流电机控制中的应用。PWM通过调节脉冲宽度实现模拟量控制,关键参数包括周期T、高电平时间Th和占空比D。文中详细阐述了AT89C52单片机实现PWM的四种方法,重点展示了50Hz舵机控制(0.5-2.5ms脉宽对应-90°至+90°)和L298N驱动直流电机的具体实现方案,包含完整的电路原理图和C语言程序代码。特别指出应用中需注意的周期选择、驱动能力、电平匹配等常见问题,并提供了参数计算示例和调试建议。

1 PWM信号

PWM(Pulse Width Modulation,脉冲宽度调制)是一种用「数字脉冲」去等效「模拟量」的技术。

1.1 三个最基本的量

1.1.1 周期 T(Period)

一个完整脉冲循环的时间,单位 μs 或 ms。

例:舵机 50 Hz → T = 20 ms。

1.1.2脉冲宽度 Th(High Time)

一个周期内输出高电平的时间。

例:舵机 1.5 ms。

1.1.3占空比 D(Duty Cycle)

D = Th / T × 100 %

例:1.5 ms / 20 ms = 7.5 %。

1.2 为什么要用 PWM

1 数字口只有 0/1,无法直接输出 3.3 V 的一半电压。

2 通过高速开关,让「平均电压」等于目标值:

Vavg = Vhigh × D

例:5 V、占空比 50 % → 等效 2.5 V(电机速度减半、LED 半亮)。

1.3 关键参数对照表

应用

周期 T

常用 Th 范围

分辨率要求

备注

LED 调光

1~5 kHz

0~100 %

8 bit

频率太低会闪

直流电机调速

10~20 kHz

0~100 %

8~10 bit

频率>20 kHz 避人耳噪声

舵机控制

20 ms

0.5~2.5 ms

1 μs

50 Hz 固定

开关电源(Buck)

50 k~2 MHz

根据拓扑

10~12 bit

MOSFET 驱动

1.4单片机里产生 PWM 的四种套路

1.4.1 纯软件延时

for/while + delay → 最简单、最不准、CPU 100 % 占用。

1.4.2 定时器中断计数

每 x μs 进一次中断,累加变量 → 精度高,可做多通道。

1.4.3 定时器硬件 PWM 模块

51 系列没有,AVR/STM32 有 OCR/ARR 寄存器,直接硬件输出。

1.4.4 专用 PWM IC 或驱动板

PCA9685(I²C 16 路)、DRV8833 等,省 IO,精度高。

1.5 计算示例(AT89C52,12 MHz,定时器 0 模式 1)

目标:50 Hz,1 μs 分辨率

计数频率:12 MHz / 12 = 1 MHz → 1 μs/次

20 ms 对应计数:20 000 次

16 位定时器最大 65 536,够用。

步骤:

设 TH0 = (65536-20000)/256,TL0 = … 先装 20 ms 周期。

再开一个「比较寄存器」存放 Th(如 1500)。

中断里计数到 Th 翻转 IO,到 20 000 再翻转 IO,循环即可。

1.6 常见踩坑提醒

周期太低 → LED/电机肉眼可见抖动或蜂鸣。

Th 精度太差 → 舵机抖动、稳速电机转速漂移。

IO 驱动能力不足 → 加三极管/MOSFET 做缓冲。

舵机高电平 5 V,STM32 单片机 3.3 V 输出时,最好加 NPN 或电平转换。

1.7 一句话总结

PWM = 「固定周期 + 可变高电平」,用数字开关把平均电压/角度/速度「模拟化」。掌握 T、Th、D 三要素,再挑合适的「生成套路」,任何 PWM 场景都能秒拆。

2 AT89C52单片机实现舵机控制

2.1 舵机专用 PWM(50 Hz)

周期:T = 20 ms(50 Hz)

有效高电平:0.5 ms ~ 2.5 ms(有些舵机 0.4 ms ~ 2.6 ms)

角度映射:
0.5 ms → −90°
1.5 ms → 0°
2.5 ms → +90°

分辨率:舵机内部一般 1 µs 对应 0.09°,所以 10 µs 步进肉眼基本看不出抖动。

2.2 电路原理图

如上图所示,AT89C52单片机实现舵机控制电路由AT89C52单片机、晶振及复位电路、舵机、控制开关和示波器组成。通过PWM信号实现舵机转角的控制,不同开关导通情况下P2.5控制信号的占空比不同,从而实现舵机转角的控制。

2.3 控制程序

//头文件与为位定义
#include <reg52.h>
#define uint  unsigned int
#define uchar unsigned charuchar Compare=200;//50HZ 抑芷?0ms
uint ZHK;//PWM信号占空比sbit k2=P2^0;//-90度
sbit k3=P2^1;//0度
sbit k4=P2^2;//90度
sbit k1=P2^5;//舵机控制信号//定时器T0产生 100μs 中断
void Timer0_init()//100us
{TMOD= 0x01;		//设置定时器模式TL0 = 0x9B;		//设置定时初值低位TH0 = 0xFF;		//设置定时初值高位 差值表示中断周期ET0=1;EA=1;	TR0=1;//启动定时器
}//定时器延时函数
void Delay(unsigned int ms)
{unsigned int i;for (i = 0; i < ms; i++){while (!TF0);  // 等待定时器T0溢出TF0 = 0;       // 清除溢出标志}
}//定时器T0中断服务函数
void Timer0() interrupt 1
{TL0 = 0x9B;		//设置定时初值低位TH0 = 0xFF;		//设置定时初值高位}
//舵机转到-90度
void chushi()
{ZHK=196;k1=0;Delay(ZHK);k1=1;Delay(Compare-ZHK);
}
//舵机转到0度
void zhongjian()
{ZHK=186;k1=0;Delay(ZHK);k1=1;Delay(Compare-ZHK);
}
//舵机转到90度
void zuizhong()
{ZHK=175;k1=0;Delay(ZHK);k1=1;Delay(Compare-ZHK);
}
//主函数
void main()
{Timer0_init();while(1){if(k2==0){chushi();}else if(k3==0){zhongjian();}else if(k4==0){zuizhong();}}
}

3 AT89C52单片机实现直流电机控制

3.1L298N电机驱动

3.1.1它到底是什么

一块“双H-桥”功率芯片(ST 原装 L298N)+ 外围电路做成的驱动板。
可同时驱动:
两台直流有刷电机,或一台四线两相步进电机。
极限参数:逻辑 5 V 供电,驱动端 5-35 V(建议 ≤24 V 长期工作),连续 2 A/桥,峰值 3 A。

3.1.2引脚速记

Power 区域
VS→ 外接 7-24 V 电机电源
GND→ 与单片机共地

VCC→ 三种用法
板上跳线帽插上:内部线性稳压给逻辑 5 V(仅当 VIN ≤12 V 时可用);
拔掉跳线帽:由外部单独 5 V 供逻辑;
反向输出:板上稳压 5 V 可引出来给单片机供电(仍要求 VIN ≤12 V)。

Motor 区域
OUT1/OUT2→ 电机 A
OUT3/OUT4→ 电机 B

Logic 区域
IN1/IN2/ENA→ 控制电机 A 的方向与使能
IN3/IN4/ENB→ 控制电机 B
ENA/ENB PWM 即可调速)

3.1.3控制逻辑真值表(电机 A 为例)

ENA

IN1

IN2

结果

0

X

X

刹车(自由)

1

1

0

正转

1

0

1

反转

1

1

1

快速刹车

PWM

1/0

0/1

调速+方向

3.1.4 AT89C52 示例代码(定时器 0 产生 1 kHz PWM)

#include <reg52.h>
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit ENA = P1^2;    // 接 L298N 的 ENA
bit pwm_out = 0;
unsigned char high = 200;   // 占空比 200/255 ≈ 78 %
void Timer0_Init()
{TMOD &= 0xF0;   // 模式 2,8 位自动重装TH0 = 256-100;  // 100*1us = 100 us → 10 kHzTL0 = 256-100;ET0 = 1; EA = 1;TR0 = 1;
}
void Timer0_ISR() interrupt 1
{static unsigned char cnt = 0;cnt++;if(cnt == 0)        pwm_out = 1;       // 周期起点if(cnt == high)     pwm_out = 0;ENA = pwm_out;
}
void main()
{IN1 = 1; IN2 = 0;   // 方向:正转Timer0_Init();while(1){/* 可在此修改 high 值调速,或改 IN1/IN2 换向 */}
}

3.1.5 常见坑 & 快速排查

现象

90 % 原因与对策

电机不转,指示灯不亮

没给 +12V;跳线帽错;共地问题

电机抖动、咔咔响

电源功率不足;PWM 频率太低

芯片过热、保护

电流 >2 A;散热片没装;占空比 100 % 长时间堵转

逻辑失控

单片机 5 V 与驱动板 5 V 没共地;ENA 悬空

3.2 单片机实现直流电机控制电路原理图

如上图所示,AT89C52单片机实现直流电机控制电路由AT89C52单片机、L298N电机驱动、开关控制电路、晶振及复位电路、输出电压显示、示波器和直流电机组成。通过软件设置不同占空比的PWM信号实现直流电机转速的控制,再通过L298N电机驱动的驱动可以实现直流电机正转、反转、停止、加速和减速的控制。

3.3 单片机实现直流电机控制控制程序

//头文件与为位定义
#include <reg52.h>
#define uint  unsigned int
#define uchar unsigned charuchar Compare=20;//50HZ 一周期20ms
uint ZHK1;//正转占空比
uint ZHK2;//反转占空比sbit IN1=P1^0;
sbit IN2=P1^1;
sbit ENA=P1^2; sbit k0=P2^0;//正转
sbit k1=P2^1;//反转
sbit k2=P2^2;//停止
sbit k3=P2^3;//正传加速
sbit k4=P2^4;//正传减速
sbit k5=P2^5;//反转加速
sbit k6=P2^6;//反转减速//定时器T0产生 1000μs 中断
void Timer0_init()//1000us
{TMOD= 0x01;		//设置定时器模式TL0 = 0x17;		//设置定时初值低位TH0 = 0xFC;		//设置定时初值高位 差值表示中断周期ET0=1;EA=1;	TR0=1;//启动定时器
}//定时器延时函数
void Delay(unsigned int ms)
{unsigned int i;for (i = 0; i < ms; i++){while (!TF0);  // 等待定时器T0溢出TF0 = 0;       // 清除溢出标志}
}//定时器T0中断服务函数
void Timer0() interrupt 1
{TL0 = 0x17;		//设置定时初值低位TH0 = 0xFC;		//设置定时初值高位}
//电机正转
void DJZHZH()
{ENA=1;ZHK1=10;IN1=1;IN2=0;Delay(ZHK1);IN1=0;IN2=0;Delay(Compare-ZHK1);
}
//电机反转
void DJFZH()
{ENA=1;ZHK2=10;IN1=0;IN2=1;Delay(ZHK2);IN1=0;IN2=0;Delay(Compare-ZHK2);
}
//停
void DJT()
{ENA=0;TR0=0;IN1=0;IN2=0;
}
//正转加速
void DJZHZH1()
{ENA=1;ZHK1=18;IN1=1;IN2=0;Delay(ZHK1);IN1=0;IN2=0;Delay(Compare-ZHK1);
}
//电机反转加速
void DJFZH1()
{ENA=1;ZHK2=18;IN1=0;IN2=1;Delay(ZHK2);IN1=0;IN2=0;Delay(Compare-ZHK2);
}
//电机正传减速
void DJZHZH2()
{ENA=1;ZHK1=2;IN1=1;IN2=0;Delay(ZHK1);IN1=0;IN2=0;Delay(Compare-ZHK1);
}
//电机反转减速
void DJFZH2()
{ENA=1;ZHK2=2;IN1=0;IN2=1;Delay(ZHK2);IN1=0;IN2=0;Delay(Compare-ZHK2);
}void main()
{DJT();	Timer0_init();while(1){if(k0==0)//正转{DJZHZH();}else if(k1==0)//反转{DJFZH();}else if(k2==0)	//停止{DJT();							} else if(k3==0)//正转加速{DJZHZH1();					} else if(k5==0)//反转加速{DJFZH1();			} else if(k4==0)//正转减速{DJZHZH2();					} else if(k6==0)//反转减速{DJFZH2();			} }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96787.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96787.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96787.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue家教预约平台设计与实现(代码+数据库+LW)

摘要 随着互联网技术的不断发展&#xff0c;在线家教平台逐渐成为家长和学生选择教育服务的重要途径。尤其在现代社会中&#xff0c;个性化教育需求日益增多&#xff0c;传统的线下家教形式已无法完全满足广大家长和学生的需求。在线家教平台不仅能为学生提供更多选择&#xf…

AI系列 - Claude 与 Qwen 模型自动补全对比:谁更胜一筹?

Claude 与 Qwen 模型自动补全对比&#xff1a;谁更胜一筹&#xff1f; 导读&#xff1a;随着大语言模型的快速发展&#xff0c;自动补全功能在代码编写、文本生成等领域变得越来越重要。本文将对比 Anthropic 的 Claude 系列模型与 Alibaba 的 Qwen 系列模型在自动补全任务中的…

【ARM】MDK在debug模式下断点的类型

1、 文档目标本文旨在深入探讨嵌入式开发环境中&#xff08;以MDK为例&#xff09;调试模式下的断点类型&#xff0c;帮助开发者全面了解不同断点的工作原理及其应用场景。通过掌握这些知识&#xff0c;开发者可以更高效地进行代码调试&#xff0c;快速定位和解决问题。2、 问题…

CF2133C 下界(The Nether)

CF2133C 下界&#xff08;The Nether&#xff09; 洛谷题目传送门 题目描述 这是一道交互题。 最近发现下界&#xff08;The Nether&#xff09;后&#xff0c;Steve 在他的世界中建造了一个由 nnn 个下界传送门组成的网络&#xff0c;每个传送门位于不同的位置。 每个传送…

无线USB转换器TOS-WLink网盘更新--TOS-WLink使用帮助V1.0.pdf

1&#xff0c;编写原因 随着当前视频越来越多&#xff0c;对于首次接触到WLink的朋友、首次开箱使用的朋友不够友好&#xff0c;常常感觉无从下手&#xff0c;为此编写了TOS-WLink使用帮助V1.0.pdf&#xff1b;按照文档进行一步一步驱动安装&#xff0c;配网&#xff1b;文档中…

Redis面试精讲 Day 29:Redis安全防护与最佳实践

【Redis面试精讲 Day 29】Redis安全防护与最佳实践 在“Redis面试精讲”系列的第29天&#xff0c;我们聚焦于一个在生产环境中至关重要、却常被开发者忽视的核心主题——Redis的安全防护与最佳实践。随着Redis广泛应用于高并发、分布式系统中&#xff0c;其暴露在公网或内网中…

【数据结构】LeetCode160.相交链表 138.随即链表复制 牛客——链表回文问题

文章目录一、相交链表问题问题描述解题思路分析思路一&#xff1a;暴力遍历法思路二&#xff1a;双指针对齐法&#xff08;最优解&#xff09;二、链表的回文结构问题描述解题思路完整代码三、 随即链表的复制问题描述解题思路复杂度分析一、相交链表问题 问题描述 给定两个单…

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【四、事务引擎核心 - MVCC与锁机制】

Mysql InnoDB 底层架构设计、功能、原理、源码系列合集 一、InnoDB 架构先导。【模块划分&#xff0c;各模块功能、源码位置、关键结构体/函数】 二、内存结构核心 - 缓冲池与性能加速器 三、日志系统 - 事务持久化的基石 四、事务引擎核心 - MVCC与锁机制 五、InnoDB 高阶…

[ pytorch ] 基于CLIP的zero-shot图像分类

论文&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 一、关于CLIP 基于图文匹配的特征学习&#xff1a;该论文证明了预测哪个标题与哪个图像…

SP95N65CTO:一款高性能650V SiC MOSFET的全面解析

碳化硅&#xff08;SiC&#xff09;功率器件因其优异的性能&#xff0c;在高频、高温、高效率的应用中越来越受到重视。本文将以SP95N65CTO为例&#xff0c;详细介绍这款650V SiC MOSFET的关键特性、电气参数与应用场景。一、产品概述SP95N65CTO是一款采用TOLI&#xff08;TO-2…

week4-[二维数组]平面上的点

week4-[二维数组]平面上的点 题目描述 有 NNN 个二维平面上的点&#xff0c;每个点的坐标都是整数且坐标范围都在 0∼9990\sim 9990∼999 之间&#xff0c;求其中出现最频繁的点的出现次数及其坐标。 输入格式 第一行有一个整数 NNN&#xff0c;表示平面上点的个数。 接下来 NN…

领域专用AI模型训练指南:医疗、法律、金融三大垂直领域微调效果对比

领域专用AI模型训练指南&#xff1a;医疗、法律、金融三大垂直领域微调效果对比 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般绚烂的技术栈中&#xff0c;我是那个永不停歇的色彩收集者。 &#x1f98b; 每一个优化都是我培育的花朵&#xff0…

在自动驾驶中ESKF实现GINS时,是否将重力g作为变量考虑进去的目的是什么?

在自动驾驶的ESKF中&#xff0c;是否将重力 g 作为估计变量&#xff0c;可以从多个维度来比较这两种方法的差异。对比维度不将重力 g 作为变量将重力 g 作为变量核心假设重力矢量 g 是已知且恒定的完美参考量。重力矢量 g 是需要被估计或校准的量&#xff0c;其值可能存在不确定…

Dify 从入门到精通(第 55/100 篇):Dify 的模型微调(进阶篇)

Dify 从入门到精通&#xff08;第 55/100 篇&#xff09;&#xff1a;Dify 的模型微调 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a;从节点…

《Password Guessing Using Large Language Models》——论文阅读

1.研究背景LLM在文本生成和理解方面表现出色&#xff0c;但直接用于密码猜测存在以下问题&#xff1a;密码与自然语言的差异&#xff08;短、无语法、需精确匹配&#xff09;生成效率低、重复率高伦理限制&#xff08;如GPT-4拒绝生成大量密码&#xff09;2.本文研究提出PASSLL…

C# 使用OPCUA 与CODESYS进行标签通讯

目录 1.导出的标签 识别标签名称 2.引用OPCUA的包 3.读写方法的封装 4.完整的业务模块封装 1.导出的标签 识别标签名称 从CODESYS导出使用标签通讯的模块文档 大概是这样子的 <?xml version"1.0" encoding"utf-8"?> <Symbolconfiguratio…

C++ 中 `std::map` 的 `insert` 函数

1. 函数的概念与用途 std::map::insert 是 C 标准模板库&#xff08;STL&#xff09;中 map 容器的一个核心成员函数。它的核心任务很明确&#xff1a;向 map 中插入一个新的键值对&#xff08;key-value pair&#xff09;。 核心用途&#xff1a; 数据构建&#xff1a;初始化一…

【机器学习学习笔记】机器学习引言

前言本文章是拨珠自己的学习笔记&#xff0c;自用为主&#xff0c;学习请移步专门教程&#xff0c;若有错误请大佬轻喷&#xff0c;也欢迎同好交流学习。本文将阐述三个问题。什么是机器学习&#xff1f;监督学习、无监督学习到底在干什么&#xff1f;分类、回归、聚类又是怎么…

程序设计---状态机

在软件工程、嵌入式开发、自动化控制等领域&#xff0c;状态机&#xff08;State Machine&#xff09;是一种描述系统行为的强大工具。它通过抽象“状态”“事件”“转换”和“动作”四大核心要素&#xff0c;将复杂的逻辑流程转化为可视化、可验证的状态流转规则&#xff0c;广…

GaussDB 数据库架构师修炼(十八) SQL引擎-分布式计划

1 分布式架构GaussDB基于MPP &#xff08;Massively Parallel Processing&#xff09; 并行架构Streaming流式计算框架2 分布式计划CN轻量化&#xff08;light proxy&#xff09; FQS&#xff08; fast query shipping &#xff09; STREAM计划 XC计划计划类型场景原理CN…