单片机PWM舵机控制

article/2025/8/18 18:20:40

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

文章目录

  • 一、PWM是什么?
  • 二、如何控制舵机?

 

 

一、PWM是什么?

PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进
行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通
过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的
时间占据整个信号周期的百分比,例如方波的占空比就是50%.

脉冲宽度调制
通过占空比编码模拟信号
占空比 一个周期内,高电平占据时长的百分比

 

二、如何控制舵机?

1. 什么是舵机
如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制
用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有0-90°、0-180°、0-360°

319b8f6b88df43db92e5056d8b7319e6.png

 2. 怎么控制舵机
向黄色信号线“灌入”PWM信号,通过控制高电平的时间,来控制舵机的角度
PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右
数据:
0.5ms-------------0度; 2.5% 对应函数中占空比为250
1.0ms------------45度; 5.0% 对应函数中占空比为500
1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250

3、定时器定时

定时器需要定时20ms, 关心的单位0.5ms, 40个的0.5ms,初值0.5ms,定时器看晶振频率。

加1经过了多少时间
当晶振频率(时钟频率)是11.0592MHz的时候,等于11059.2KHz = 11059200Hz
机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000/ 11059200 微秒 = 1.085 微秒
 

代码如下(示例):

#include <reg52.h>
int jd;
sbit sg90_c = P1^1;
int cnt =0;
void Delay300ms()		//@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void Time0init() 		//定时器0初始化
{//1.配置定时器0工作模式位16位计时TMOD=0x01;  //TL0,TH0全用 0 1//2.给初值,定一个10ms出来TL0= 0x33;TH0= 0xFE;  //TL0存放低八位00,TH0存放高8位DC//3.开始计时TR0=1;//4.打开定时器0中断ET0=1;//5.打开总中断EAEA=1;
}void main()
{Delay300ms();Time0init();jd =1;  		//角度为1,即只有一个0.5ms的高电平,为0°cnt = 0;sg90_c = 1;  //先让舵机一开始处于高电平//4.爆表了while(1){jd=4;		//舵机转135°时,高电平时间是2ms,需要4个0.5mscnt =0;Delay300ms();jd = 1;cnt=0;Delay300ms();}
}//TF0爆表时,硬件自动调用中断函数
void Time0Handler() interrupt 1  //定时器0的中断号
{cnt++;//重新赋初值TL0=0x33;TH0=0xFE;if(cnt<jd) 		//舵机转135°时,高电平时间是2ms,需要4个0.5ms{sg90_c=1;  }else{sg90_c = 0;  //一直保持低电平到结束}if(cnt==40)  //爆表40次,经过20ms,结束第一次PWM周期,PWM为50HZ{cnt=0;    //重新让cnt从0开始,计算下一次的20mssg90_c=1; //每次cnt为0时(即初始状态)处于高电平,等待PWM}}

 


 

 

 


http://chatgpt.dhexx.cn/article/V5RbWeIY.shtml

相关文章

快速学习Stm32舵机控制板控制多个舵机运动以及调速

本次分享stm32对多个舵机的控制&#xff0c;之前讲解过单个舵机的控制。以及控制原理&#xff0c;定时器的使用和pwm的输出来控制一个舵机的角度转向。这次就和大家分享一下多个舵机的控制以及调速。利用单片机实现对 8 个舵机的同时控制&#xff0c;掌握多个舵机控制程序实现方…

51单片机舵机控制

51单片机舵机控制系统 概述硬件设计程序设计PWM波的产生矩阵按键功能与数码管显示参数传递完整程序 外加模块 概述 在这篇博客中&#xff0c;将介绍一个基于51单片机的舵机控制系统&#xff0c;其可以通过矩阵按键输入角度&#xff0c;舵机打到预定角度&#xff0c;并在数码管…

Arduino基础入门篇28—舵机控制

舵机是一种位置「角度」伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具、航模、机器人中已经得到普遍使用。舵机是一种俗称&#xff0c;其实是一种伺服马达。本篇通过官方驱动库来实现舵机控制。 1. 舵机介绍 结构组成 舵机实…

OpenMV输出PWM,实现对舵机控制

OpenMV的定时器官方函数介绍&#xff1a;Timer类 – 控制内部定时器 目录 OpenMV的PWM资源介绍 为什么要用OpenMV输出PWM OpenMV的PWM资源分配 资源 注意 建议 PWM输出代码 代码讲解 Timer Timer.channel tim.channel与Timer.channel区别 Timer.channel解析 OpenM…

舵机控制原理及常见问题

舵机控制 工作电压&#xff1a;3.5V/4,2V/4.8V —— 6V/6.8V/7.2V/8.4V(看具体型号参数) 切记&#xff1a;舵机不要接在电脑USB上调试&#xff0c;舵机启动瞬间大电流&#xff08;10-24倍工作电流&#xff09;可能会导致电脑死机 注意事项&#xff1a;PWM波形正确时&#xf…

第9章 舵机控制

有一种电机可以在程序的控制下&#xff0c;在一定范围内连续改变输出轴角度并且可以保持住。这种电机最早被用在航模和船模等遥控模型中&#xff0c;控制各种舵面的转动&#xff0c;这就是舵机。现在舵机除了运用在 遥控模型中&#xff0c;也大量的运用在各种机器人、机械臂的关…

Arduino入门001 - 舵机控制

Arduio基础入门篇001 - 舵机控制 一、舵机介绍 1&#xff0c;结构组成 一般来讲舵机主要由以下几个部分组成&#xff0c;舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等。舵机的输入线共有三条&#xff0c;如图1所示&#xff0c;红色中间&#xff0c;是电源线&…

舵机控制(STM32F103C8T6)

前言 本文是以STM32F103C8T6作为主控芯片&#xff0c;通过PB6端口输出PWM&#xff0c;实现控制180舵机。 一、舵机控制原理 &#xff08;一&#xff09;概述 舵机是一种位置伺服驱动器器&#xff0c;是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时&#xff0c;…

Java 源代码怎么执行的

许多 Java 虚拟机的执行引擎在执行 Java 代码的时候都是解释执行&#xff08;通过解释器执行&#xff09;和编译执行&#xff08;通过即时编译器产生本地代码执行&#xff09;混合运行。 大体流程为&#xff1a; 编写 java 文件源码通过 javac 编译器将 java 源码编译为字节码流…

Java基础-java程序代码截取字符串及判断字符串是否包含某个字符(串)

文章目录 有一串字符串&#xff0c;是一串拼接码&#xff0c;如何截取获取想要的字段&#xff1f;判断字符串是否包含某个字符&#xff08;串&#xff09;indexOf方法 有一串字符串&#xff0c;是一串拼接码&#xff0c;如何截取获取想要的字段&#xff1f; public class Inte…

编写高质量JAVA程序代码的建议

--------------------------------------------------------------------------------------------------- 前言&#xff1a;原著《改善JAVA程序的151个建议》有151个建议&#xff0c;我在拜读的过程根据自己的理解合并了其中的几个&#xff0c;并将每个建议的核心要义进行了一…

java简单记事本代码_简单记事本的java程序代码

展开全部 天啊&#xff0c; 冖_Na0 为什么会有62616964757a686964616fe4b893e5b19e31333262343038我编的记事本代码呢&#xff1f;&#xff1f;&#xff1f;呵呵……你肯定是“请教”过我的吧&#xff1f;&#xff1f; 呵呵……我自己编了一个&#xff0c;不过呢&#xff0c;没…

IntelliJ IDEA 写java程序代码

快捷键 注释 单行&#xff1a;选中代码 ctrl/ 再来一次就是取消 多行&#xff1a;选中代码 ctrlshift/ 再来一次就是取消 格式化 CtrlAltL

Android studio如何运行java程序代码

先看Java程序类 public class GGG {public static void main(String[] args) {System.out.println("我是java程序");} }就是这么简单的一个java程序&#xff0c;在之前studio上可以直接运行&#xff0c;但是像现在升级studio后就发现运行报错&#xff1a; 首先java…

怎样使用lntelliJ IDEA 编写Java程序代码?

下面使用IDEA创建一个Java程序&#xff0c;实现在控制台上打印HelloWorld!的功能&#xff0c;具体步骤如下。 1.创建Java项目 进入New Project界面后&#xff0c;单击New Project选项按钮创建新项目&#xff0c;弹出New Project对话框&#xff0c;如下图所示。 New Projeet 对…

Java学习代码合集

其实我学习java最根本的原因是&#xff1a;我是一个挺关注外在的人&#xff0c;虽然是个程序员&#xff0c;所以我很喜欢写出那些带有漂亮的界面的程序&#xff0c;因为C总是控制台&#xff0c;我不是很喜欢&#xff0c;在这份java代码合集中&#xff0c;我会记录自己学习Java界…

Java开发常用代码

一.获取UUID UUID uuid UUID.randomUUID(); String str uuid.toString(); // 去掉“-” String s str.replaceAll("-", "");二.获取固定格式的时间字符串 第一种 //获取当前时间对象 Date d new Date(); //创建日期格式化类对象,”yyyy/MM/dd HH:mm…

一个简单的Java例程

编写一个程序&#xff0c;输出如下&#xff1a; 1.在IDEA中新建一个helloworld类&#xff0c;注意Java中严格区分大小写 2.在文件中添加如下代码&#xff1a; 源代码如下&#xff1a; public class helloworld{public static void main(String[] args){System.out.println(&q…

Python3读取大文件的方法

Python3读取大文件的方法 1. 方法一&#xff1a;利用yield生成器2. 方法二&#xff1a;利用open()自带方法生成迭代对象&#xff0c;这个是一行一行的读取3. 二者的比较 1. 方法一&#xff1a;利用yield生成器 def readPart(filePath, size1024, encoding"utf-8"):w…

大文件处理(上传,下载)思考

文件处理一直都是前端人的心头病&#xff0c;如何控制好文件大小&#xff0c;文件太大上传不了&#xff0c;文件下载时间太长&#xff0c;tcp直接给断开了&#x1f631;&#x1f631;&#x1f631;等 效果 为了方便大家有意义的学习&#xff0c;这里就先放效果图&#xff0c;如…