51单片机控制舵机,舵机不动的定时器原因
舵机:
红色:VCC
棕色:GND
黄色:PWM
这是定时器0初始化:
unsigned cha count = 0;
unsigned char timer1 ;void Timer1_Init()
{
// TMOD&=0x00;
// TMOD|=0x01; //定时器T1设置成方式1TMOD &= 0xF0; //设置定时器模式TH0 = (65536-100)/256;TL0 =(65536-92)%256;ET0=1; //打开定时器0中断允许 TR0=1; //打开定时器0EA=1; //打开总中断
}
这是舵机运行函数:
void duoji()
{timer1 =5;//舵机恢复到0度的位置count=0;//让定时器重新计数delay_ms(200);timer1 =15;//舵机旋转90度count=0;delay_ms(200);
// timer1=25;//舵机转动180度
// count=0;
// delay_ms(300);
}
这是定时器0中断:
void InterruptTime0() interrupt 1
{TR0 = 0;//关闭定时器TH0 = (65536-100)/256;TL0 = (65536-92)%256;if(count <= timer1) //5==0° 15==90°{ PWM = 1; }else { PWM = 0; }count++;if (count >= 200) //T = 20ms清零 //这里可以替换成count%200;{ count = 0; }TR0 = 1; //开启T0
}
这是主函数部分:
void main()
{ Timer1_Init() ;while(1){ duoji();}
}
以上代码可做舵机调试例子。
问题是这样的,我们都知道以下代码可做为100us的定时。
TH0 = (65536-100)/256;
TL0 = (65536-100)%256;
然而当将此段代码植入程序运行舵机发现舵机卡死;
于是采取软件定时器得到TH0,TL0的值;
通过计算器算得TH0值为255,TL0值为164;而(65536-100)%256=156;小于软件得到的164
通过计算器不断取值得到应该减去92,也就是(65536-92)%256。
推测定时器低位的这种取值方法可能存在误差。且正好为8。
然而当我们取
TH0 = (65536-500)/256;
TL0 = (65536-500)%256;也就是取0.5ms
如将timer1值改为对于的40;也就是20ms的周期时发现程序完美运行。
51单片机控制舵机,舵机不动的定时器原因相关推荐
- 51单片机控制SG90舵机、MG90S舵机
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...
- 51单片机控制小舵机
以前从没有想过写博客,但是最近发现以前的代码老是找不到,而且找到了也不一定想得起当时的逻辑,很麻烦,所以打算写写提醒一下自己. 最近老板让做一个扫描二维码装钥匙的小盒子,就给个小舵机和3D打印机,传动 ...
- 51单片机控制sg90舵机
1.PWM PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就 ...
- 51单片机c语言直流电机廷迟启停,51单片机控制直流电机不会加定时器延时程序...
这是自己改的延时,串口输入1,电机转动,再输入其他没用了 #include void uart_init(); void qudong (unsigned int t); sbit en1=P0^0; ...
- 【Proteus仿真】51单片机8路舵机点动±90°点动控制
[Proteus仿真]51单片机8路舵机点动±90°点动控制 Proteus仿真 Proteus连线图 程序代码 #include<reg52.h>sbit PWM0 = P1^0; sb ...
- 51单片机控制TB6600驱动器驱动42步进电机
51单片机控制TB6600驱动器驱动42步进电机 第一次 功能实现目标 硬件简介 硬件连接 程序代码 第一次 以前总是看别人写的博客,通过别人的博客解决了我很多问题,从中也学到了各种知识,虽然不是很系 ...
- 51单片机入门教程(5)——定时器中断
51单片机入门教程(5)--定时器中断 一.中断的概念 二.定时器中断 2.1 软件延时的不足 2.2 中断寄存器 2.2.1 中断允许控制寄存器 IE 2.2.2 定时器工作方式寄存器 TMOD 2 ...
- 51单片机控制二相四线步进电机
步进电机按定子上绕组来分,有二相.三相和五相等系列.最受欢迎的是两相混合式步进电机,约占97%以上的市场份额,其原因是性价比高,配上细分驱动器后效果良好.该种电机的基本步距角为1.8°/步,配上半步驱 ...
- 51单片机控制的数字温度计 PROTEUS 和51单片机教程
51单片机控制的数字温度计 总览部分 MCU部分 显示部分 开仿真以后实时显示温度 因为这个程序比较简单,我就直接上代码了,有不明白的请看我以前的文章,谢谢哦! 参考代码如下: #include &q ...
- 51单片机控制步进电机-电路连接
51单片机控制步进电机-电路连接 概要:本案例讲解的内容是51单片机控制步进电机硬件连接部分.后续会分别讲解单片机程序,S曲线加减速方法,上位机等相关内容 硬件清单: 1.51单片机控制板一个 2.二 ...
最新文章
- Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?
- Linux tar.gz、tar、bz2、zip的区别,如何选择呢
- 罕见!百度、微博、拼多多、B站等全国34家互联网巨头集体表态
- [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
- C/C++语言之通过定义指针函数方式来实现在一个cpp文件里面获取另外一个cpp文件函数的返回值
- rman备份rman-00554 ,rman-04005错误
- ASP.NET MVC TagBuilder使用
- DELL服务器运行硬件检测
- tcp/ip协议栈总结
- 一个简单的if控制语句
- Java读取星历excel数据并计算卫星坐标
- chm转换成txt的url顺序问题
- VMware虚拟机中安装的系统共享主机无线网络的方法
- ionic自定义图标(ion-icon)
- 基于nodejs+vue+elementui酒店民宿客房预订管理系统
- java8 .stream().anyMatch / allMatch / noneMatch用法
- Java线程池原理与实例详解
- 亲历:IT 从业者避免猝死攻略 v1.0
- [杂谈]亿元大奖为何总落陌生客
- 应用宝认领应用签名_Android腾讯应用宝应用认领