历史上的今天
返回首页

历史上的今天

今天是:2025年01月03日(星期五)

正在发生

2020年01月03日 | 使用AVR单片机驱动舵机

2020-01-03 来源:eefocus

1.舵机驱动的基本原理

  (可以参考http://blog.sina.com.cn/s/blog_8240cbef01018hu1.html)

  "控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。"

简单的来讲,就是输出一个周期为20Ms,不同的占空比对应舵机转过不同的角度。

难点主要在于

  • 舵机控制信号需要保持,这样就比用脉冲控制步进电机要复杂一些。

  • 你需要保持多路PWM,并且要随时调节占空比来获得要求的角度

2.实现思路

网上有用工作在相频修正PWM模式下的T1来产生信号,这样虽然十分精确,然而并不太好实现多路控制.(至少我是没想出来,如果有高手知道怎么做,还望多多指教)

我决定采用以下方法:

  • 将 20ms 等分成240份,这样一份是20000/240 us //分成240份的原因是这样可以算出整数值得TCNT1

  • 将T1配置为溢出中断模式,每20000/240 us溢出一次

  • 中断服务程序更新TCNT1的值,维护一组变量,产生信号。

这样做的优点是方便了多路控制。虽然我只控制了四路舵机,稍加修改就可以控制更多..

然而中断服务程序中维护变量时,产生的微小误差会累加,这样不可避免的会产生较大误差。直接采用计算值肯定不行,最后需要修正。

3.代码

代码还是相当的不成熟...愿各位高手多多指教.

通过传入一个指针给Servo_AngelPWM实现四个舵机的角度控制


#include

#include

#ifndef SERVO_CONTROL_H

#define SERVO_CONTROL_H

#define Servo1  PB7

#define Servo1_1 PORTB|=_BV(Servo1)

#define Servo1_0 PORTB&=~_BV(Servo1)

#define Servo2  PB6

#define Servo2_1 PORTB|=_BV(Servo2)

#define Servo2_0 PORTB&=~_BV(Servo2)

#define Servo3  PB5

#define Servo3_1 PORTB|=_BV(Servo2)

#define Servo3_0 PORTB&=~_BV(Servo2)

#define Servo4  PB4

#define Servo4_1 PORTB|=_BV(Servo2)

#define Servo4_0 PORTB&=~_BV(Servo2)

#define to_us(x) (((x/180.0)*2.0+0.5)*1000)

uint32_t Servo_Flag[4];

uint32_t Servo_Cflag=0;

void Servo_AngelPWM(char *angel)

{

    for(int i=0;i<4;i++)

        Servo_Flag[i]=to_us(angel[i])*3/250;

    TIMSK|=_BV(TOIE1);//开启TC1中断 

}

ISR(TIMER1_OVF_vect)

{

    TIMSK&=~_BV(TOIE1);//关闭TC1中断               //1

    TCNT1=64525;//65535-(1000+10)这个10加的有讲究 //3

    Servo_Cflag++;                                  //4

    if(Servo_Cflag>=239)                          //5

    {

        Servo1_1;

        Servo2_1;

        Servo3_1;

        Servo4_1;

        Servo_Cflag=0;

    }

    else if(Servo_Flag[0]==Servo_Cflag)Servo1_0;  //6

    else if(Servo_Flag[1]==Servo_Cflag)Servo2_0;  //7

    else if(Servo_Flag[2]==Servo_Cflag)Servo3_0;  //8

    else if(Servo_Flag[3]==Servo_Cflag)Servo4_0;  //9

    TIMSK|=_BV(TOIE1);//开启TC1中断                //10

}

#endif


4.后记

给TCNT1赋计算值,也就是65535-1000=64525时,产生的信号大约是47HZ。如我所料,准确性比较差。


然后尝试根据分析语句来修正TCNT1的初值,可以从我的注释看出...修正完后大约是48hz,还是不太准。


最后直接上示波器微调了...当TCNT1为64569(修正值34)时,如上图,产生了比较准确的驱动信号(45度和90度)。


(所以说学会汇编还是很重要的...有时间一定要研究研究)

推荐阅读

史海拾趣

AntennaHome公司的发展小趣事

为了进一步提升品牌影响力和市场知名度,AntennaHome公司积极参与国际电子行业的各大展会。在展会上,公司展示了最新的天线技术和产品,吸引了众多国内外客户的关注。通过与客户的深入交流,公司不仅收获了宝贵的市场信息和合作机会,还进一步提升了品牌在行业内的地位。

百佳(BAIJIA)公司的发展小趣事

在多年的发展过程中,百佳公司始终坚守品质至上的原则。他们严格把控产品质量,从原材料采购到生产制造的每一个环节都进行严格的监控和检测。同时,百佳公司还注重提升客户服务水平,为客户提供及时、专业的技术支持和售后服务。正是这种对品质的坚持和对客户的尊重,使得百佳公司赢得了广大客户的信赖和长期合作。

这五个故事只是百佳公司在电子行业发展中的一部分缩影。它们展示了百佳公司从初创时期的艰苦与坚持,到抓住市场机遇迅速崛起,再到技术创新引领发展、拓展国际市场实现全球化布局,以及坚持品质至上赢得客户信赖的完整历程。这些故事不仅见证了百佳公司的成长和成功,也展现了电子行业的蓬勃发展和无限可能。

Cramer公司的发展小趣事

随着5G技术的普及,Cramer公司紧跟时代潮流,开始研发5G通信设备。他们与多家通信巨头合作,共同推进5G技术的发展。经过不懈的努力,Cramer公司成功研发出了一款高性能的5G路由器。这款产品的推出,使得Cramer公司在5G市场上取得了先机,并为其带来了丰厚的回报。

华大北斗(Allystar)公司的发展小趣事

在智能家居领域,Cramer公司也展现出了强大的创新能力。他们推出了一款智能家居控制系统,该系统可以通过手机APP远程控制家中的电器设备。为了实现这一功能,Cramer公司投入了大量资源进行技术研发,并与多家家居品牌达成了战略合作协议。这款产品的推出,使得Cramer公司在智能家居市场上占据了一席之地。

AD Semiconductor公司的发展小趣事

在早期的发展阶段,Cramer公司推出了一款革命性的智能手机。这款手机采用了最新的芯片技术和高分辨率显示屏,为用户提供了出色的使用体验。为了满足市场需求,Cramer公司加大了研发投入,不断优化产品性能。最终,这款手机在市场上取得了巨大的成功,为Cramer公司带来了可观的收益,并奠定了其在电子行业中的地位。

Fluke公司的发展小趣事

随着可穿戴设备的兴起,Cramer公司迅速捕捉到了市场机遇。他们推出了一款智能手表,该手表不仅具备基本的时间显示功能,还集成了健康监测、运动追踪等多项实用功能。为了提升产品的竞争力,Cramer公司与多家科技公司合作,共同研发新技术。这款智能手表在市场上获得了广泛认可,进一步提升了Cramer公司的品牌知名度和市场份额。

问答坊 | AI 解惑

多彩LED餐桌和茶几

      在LED的非典型用法:环境光探测中曾经提到过基于LED点阵的触摸,作者的演示虽然粗糙,但是有人利用同样(相似)的原理,作出一件非常出色的作品,而且售价不菲。        Because We Can, LLC制 ...…

查看全部问答>

STM32调起来还得看RP?

BOOT0/1得来回倒腾。BOOT0=0调试一次之后如果停止调试,再启用调试就出现“Programming Failed!”错误 试出来唯一的解决方法就是始终保持BOOT1=1。 如果出现BOOT0=0无法调试的情况,就断电改成BOOT0=1再上电,从RAM启动,运行J-link ARM软件,连 ...…

查看全部问答>

嵌入式linux系统与应用开发就业班

课程描述 参加嵌入式linux系统与应用开发就业班可以使学员快速掌握嵌入式系统开发的流程,系统移植的方法,编写Bootloader等。学习本课程的学员能够从事嵌入式系统相关的项目开发。 1、培训过程中,如有部分内容理解不透或消化不好,可免费在下期 ...…

查看全部问答>

linux系统裁剪,制作成ISO安装盘,如何做?

请教各位前辈一个问题:  我要将linux系统裁剪(系统功能简单,只需要保留网络功能),并制作成ISO光盘安装,如何做?  1.使用定制安装linux系统,如使用LFS, Gentoo安装。 问题:安装后的系统如何制作成ISO,实现光盘安装?&n ...…

查看全部问答>

怎么我的nb0文件没生成呀??

按照《WinCE5.0 BSP BOOTLOADER开发详解-生成bin和nb0 》(http://blog.eeworld.net/xiaoxiangtian/archive/2008/09/22/2963028.aspx)的方法做的,却只能得到bin文件,得不到nb0文件,高手们帮帮忙呀…

查看全部问答>

求教 如何截获格式化磁盘的消息!

小弟正在做一个功能,防止格式化磁盘,想截获windows格式化磁盘的消息,请问应该怎么截获或者是有什么好办法呢?…

查看全部问答>

帮忙推荐一款适合于初学者arm开发板,最好有详细的实验手册,我想买周立功牌子的

我想买一套周立功的arm开发板,我原先看重的是一款easyarm1138 的板子,他网站上介绍的价格是198元,然后打电话过去问了一下,他说这款板子过期了,并且配套的试验教材和文档也没有,他推荐我买easyarm 2131,480元,且配有各种资料文档。 大家, ...…

查看全部问答>

协议驱动的简单问题!谁帮我解决我送150分!急!

链接是我在网络版块提的问题!在这里也问问大家!各位大虾帮我!150分,不够还可以加! http://topic.eeworld.net/u/20080124/10/3e66c379-f123-4581-9a21-06514d1350d6.html…

查看全部问答>

wince上 如何实现端口和进程关联

RT 谁做个这方面的 能否提供点思路 或者源码 PC上关于这方面的代码都挺多的,在Wince上没有找到相关的资料,迷茫 据我分析 PC上的方法在Wince上面都无法实现的 PC上的方法: 1. 通过IP Helper Function中的几个未公开的函数实现 All ...…

查看全部问答>

诚招ARM工程师-北京

诚招ARM工程师,工作地北京,要求如下: 1. 自动控制、计算机、或通信专业本科学历; 2. 嵌入式(ARM、51)产品开发5年以上经验; 3. 熟悉常用的单片机系统外设(电源管理、通信接口、LCD、键盘等) 4. 能独立进行硬件电路板的设计; 5. ...…

查看全部问答>