历史上的今天
今天是:2024年10月17日(星期四)
2019年10月17日 | 浅谈用单片机控制SG90舵机
2019-10-17 来源:51hei
SG90舵机(模拟舵机)
一、日常吐槽额~~~~~~,在开始今天的主题之前,占用大家一些时间。容我骂街一番,$##%%%$%#$#$$%^艹……………….,哎呀妈呀,骂的有点喘不过来了,额~呸,是言(文明人,文明人)。
可能就奇了怪了,你不好好码字,骂什么街呢!说来惭愧,上边被骂的人就是笔者自己。今天在调试程序的时候,对,就这个鬼舵机,怎么都不转!!!检查硬件---检查程序---百度,如此反复N小时。始终找不到问题所在,程序呢,怎么看,怎么美!硬件呢,怎么看,怎么帅!说是急,那是快,电闪雷鸣,刀光剑影,啪,一个数字1摔在脸上,于是乎,快速打开课本,啪~啪~啪,数字0、1,大脑瓜子一拍,哎呀,一定是这错误了!快速拿起闪闪发光的鼠标,熟练的打开Keil4,一段操作猛如虎,只听见那吱~吱~吱~吱,舵机工作了~~~~
粗心大意:定时器0对应的中端口----void Timer() interrupt 1
马虎大意的我写成了这样:void Timer() interrupt 0.
家都走错了,人家咋可能给你钱,大家一定要引以为戒,细心细心再细心
注意:C语言用关键字“interrupt+数字”来代替汇编中中断入口地址
——————————————————————————————————
以上非本次笔记重点,只是笔者一点小小的吐槽,外加一点小小的知识
——————————————————————————————————
二、主咖登场基本概念:1.舵机:舵机是一种位置(角度)伺服的驱动器,适用那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其实质是一个伺服马达。
2.模拟舵机:需要不断的发送目的地PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要不断的发送90度的PWM信号直到到达指定位置才能停止。
3.数字舵机:只需给一个目的地PWM信号,即可旋转到指定位置。例如:我现在让它旋转90度,我只需要发送一次90度的PWM信号,它就可以旋转到90度。
4.PWM信号:PWM(脉冲宽度调制)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。那么什么叫PWM信号呢,笔者就简单的谈一下自己的看法,我们都知道,我们所使用的单片机都是数字电路,它的I/O口只有两种状态,那就是高电平(1),低电平(0)。知道了这些之后,我们通过控制微处理器输出1-0-1-0-1-0-1-0……如此循环往复,就成为下图1所示的情况,这就是PWM信号。
图1.PWM信号
5.占空比:高电平(或者低电平)占整个周期的时间就叫作占空比。
6.PWM频率:PWM频率是指每秒钟信号从高电平到低电平再到高电平的次数。
工作原理 理解以上的概念,对我们接下来的学习是非常有必要的,希望大家能好好掌握上面的概念。
我所使用的SG90舵机,如下图2所示
图2
接线方法:
红-------------------------VCC
棕色----------------------GND
橙色----------------------信号线
原理:舵机内部有一个基准电压,微处理器产生的PWM信号通过信号线进入舵机产生直流偏置电压,与舵机内部的基准电压作比较,获得电压差输出。电压差的正负输出到电机驱动芯片上,从而决定正反转。当舵机开始旋转的时候,舵机内部通过级联减速齿轮带动电位器旋转,使得电压差为零,电机停止转动。
重点:作为一个单片机编写者,具体的原理,我们不必要搞清楚,我们只需知道如何控制它即可,以下将讲解如何控制舵机运转。
第一步:我们需要使用单片机产生周期为20ms,高电平t等于0.5ms-2.5ms之间的这样一个方波。定时器+中断产生这样的方波。
高电平在一个周期(20ms)的持续时间对应的舵机角度,如下图所示。
第二步:简单讲一下编程思想吧,我所使用的是方法是定时器+中断,定时器每0.5ms中断一次,需要中断40次才能达到20ms。我们此时需要一个全局变量来记录中断的次数,当中断达到40次时,全局变量重新清零。当中断次数小于a时,信号线输出高电平,否则输出零。此时a的值对应关系如下(1--0度,2--45度,3--90度,4--135度,5--180度)。
第三步:着重讲程序中一个语句的含义
为什么此处要此处a==16,a==32,首先,这个值是我一步步测试出来的,如果你看见源程序的话,上面有详细的介绍,此处不再赘述。
我们知道SG90是一个模拟舵机,需要不断的给出信号才能到达指定的位置。到达这个位置并不是一蹴而就的,它需要时间,实际上面的a==16,相当于延时,这段时间刚好能够让舵机达到指定的位置,然后在接收下一个回摆程序。a==32,是因为我需要让它来回摆动的时间对称,所以才用a==32的。有兴趣的可以改变a的值,观察一下具体的情况。
#include sbit SG_PWM=P0^0; unsigned char count=0; unsigned char PWM_count=3; //1--0度,2--45度,3--90度,4--135度,5--180度 unsigned char a=0; void Timer_Init() { TMOD=0X01; //T0定时方式1 TH0=0Xfe; TL0=0X33; //计数初值设置为0.5ms ET0=1; //打开定时器0的中断 TR0=1; //打开定时器0 EA=1; //开总中断 } void Timer() interrupt 1 //特别注意此处,0--外部中断0,1--定时器中断0,2--外部中断1,3--定时器中断1,4--串行口中断1 { TR0=0; TH0=0Xfe; TL0=0X33; //重新赋计数初值为0.5ms if(count<=PWM_count) { SG_PWM=1; } else { SG_PWM=0; } count++; if(count>=40) { count=0; a++; } TR0=1; } void main() { Timer_Init(); while(1) { if(a==16) //20是比较舒服的连贯动作,20以上动作些许不连贯 10的时候出现打架情况,15的时候打架几乎没有,16比较完美 { PWM_count=1; } if(a==32) { PWM_count=3; a=0; } } }
史海拾趣
|
2007年全国大学生电子设计竞赛 讨论专用帖(附加了几道与公布器件相关的题目、附加 本帖最后由 paulhyde 于 2014-9-15 08:57 编辑 2007年全国大学生电子设计竞赛马上拉开帷幕根据清单可以猜测很多题目。有需要的话大家踊跃讨论。附2007年全国赛元件清单: 1、基本仪器清单 20MHz普通示波器(双通道,外触发输入,有X轴输入,可选 ...… 查看全部问答> |
|
ThinkPad要出上网本的消息已成板上钉钉的事实,今日曝光的产品外观、配置等资料已表明此产品正在有条不紊的进行中。从此次爆出的详细消息看,ThinkPad X100e上网本并不是只有黑白两款颜色,还包含了另外一款红色外观的产品,当然硬件配置是相同的。 ...… 查看全部问答> |
|
如何用单片机控制液晶显示器? 我用的是MSP430f149单片机,现在需要在这块板子上编码,去控制液晶显示器显示东西。 请问前辈们给点思路,该怎么做? 我不知道从何处下手。。。谢谢了… 查看全部问答> |
|
情况是这样的,我用pa0发送周期为100us的方波信号,用pa1接收,中间连接一个39k的电阻,为什么用示波器检测到的信号低电平被拉高了 0.68v,高电平仍然是3.几v,而不连接pa1的话低电平还是0,不会被拉高。这个是为什么,求解答啊,我想要的是不被拉 ...… 查看全部问答> |
|
技术说明 如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,430的定时器功能比较丰富, 有定时、比较、捕获。 定时很好理解,就是设定好输入时钟以及计数个数后,定时器就会在输入时钟周期个数达到设定个数后发生中 ...… 查看全部问答> |
|
全球首创内置三级管的非隔离LED恒流驱动QX6102/20W 概述 QX6102是一款内置NPN功率三极管,具有自供电功能的高精度降压型大功率LED恒流驱动芯片,适用于交流85V到265V全范围输入电压的非隔离LED恒流驱动电源。芯片采用自供电结构,无需辅助绕组,内置NPN三极管,提供高性价比。专利的高端电流检测、 ...… 查看全部问答> |




