lionmilk 发表于 2007-7-9 18:58:38

用avr控制舵机,需要光耦之类的隔离吗?

前两天买了2个舵机,用M16控制(马老师的试验板),用了本站的范例程序,也试了试bascom控制,总是有些不流畅,有时候舵机会抖动但是没有明显的转动(可能是角度比较小的来回转动吧),感觉是不是有什么干扰,手头没有示波器。

觉得应该在单片机的控制信号和舵机的信号线之间应该用光耦隔离一下好些,手头没有光耦,就接了个104电容,确实要流畅些,但仍不满意。可能还是要个光耦之类的吧?

曾用电池作为试验板的供电电源,舵机似乎转不动,不知道是不是电流不够,觉得可以加个驱动芯片,既可以隔离,又可以增加驱动力,如l293。不知道uln2003行不行。

望大家指点,谢谢!

zhou_1989 发表于 2007-7-10 23:18:41

舵机的控制线不需要功率。只是一个信号。

自然不需要驱动。

抖动可能是控制的方波要使舵机停在它两个分度位置的中间或占空比不稳定,自然就抖动了。

lionmilk 发表于 2007-7-12 23:14:23

谢谢,太有道理了,本人愚钝,只是控制信号,当然不用驱动,呵呵。

不知道是不是占空比不稳定,发现玩AVR到一定时候好像非得要个示波器才行。

lionmilk 发表于 2007-7-12 23:24:44

最初看见主坛上有帖子讨论舵机的,本来这个帖子想发在主坛的,但是觉得发在这里可以活跃一下机器人论坛。希望大家踊跃一些。帖子发了几天,看的人都不多,确实比较冷清。



下面是我用avrlib中的舵机驱动程序的demo代码,希望有前辈提供一些改进意见,可以让舵机转动更流畅。

占空比不稳定有没有可能是跟内部RC不准有关呢?



#include <avr/io.h>                // include I/O definitions (port names, pin names, etc)

#include <avr/signal.h>        // include "signal" names (interrupt names)

#include <avr/interrupt.h>        // include interrupt support



#include "global.h"                // include our global settings

#include "servo.h"                // include RC servo driver library



void servoTest(void);



//----- Begin Code ------------------------------------------------------------

int main(void)

{



        timerInit();

        // begin servo test

        servoTest();

        return 0;

}



void servoTest(void)

{

        u08 pos;

        u08 channel;



        // do some examples

        // initialize RC servo system

        servoInit();

        // setup servo output channel-to-I/Opin mapping

        // format is servoSetChannelIO( CHANNEL#, PORT, PIN );

        servoSetChannelIO(0, _SFR_IO_ADDR(PORTD), PD0);

        servoSetChannelIO(1, _SFR_IO_ADDR(PORTD), PD1);

        servoSetChannelIO(2, _SFR_IO_ADDR(PORTD), PD2);

        servoSetChannelIO(3, _SFR_IO_ADDR(PORTD), PD3);



        // set port pins to output

        outb(DDRD, 0x0F);



        pos = 0;



#define SPEED_SERVO        1



        // spin servos sequentially back and forth between their limits

        while(1)

        {

               

                for(channel=0; channel<SERVO_NUM_CHANNELS; channel++)

                {

                        for(pos=0; pos<100; pos++)

                        {

                                servoSetPosition(channel,pos);

                                timerPause(SPEED_SERVO);

                        }

                }



                for(channel=0; channel<SERVO_NUM_CHANNELS; channel++)

                {

                        for(pos=100; pos>=1; pos--)

                        {

                                servoSetPosition(channel,pos);

                                timerPause(SPEED_SERVO);

                        }

                }

               



        }

       

}

zhou_1989 发表于 2007-7-13 08:39:32

...我穷...不过还是搞了台古董示波器。

lionmilk 发表于 2007-7-17 18:14:22

看来还是的弄个二手的示波器玩玩,呵呵。

唉,现在的桌子已经放不下更多的东西了,而且买个这样的“古怪”仪器一定又会被老婆骂的,呵呵。

最近正在忙自己专业上的事,过一段时间才有空研究舵机了,到时候有了进展再与大家分享。

ainet 发表于 2007-7-21 11:54:54

被老婆骂 是一定的,如果你能做个让她开心的东西,又不一样了,哈哈

laoki8888 发表于 2007-7-30 09:20:02

AVR的舵机驱动实验

2007-07-28 22:07

mode15模式,系统时钟8Mhz,分频8,频率100Hz,脉宽1.5ms,改变OCR1B即可改变舵机角度



TCCR1A=0x23;

TCCR1B=0x9a;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x28;

OCR1AL=0x00;

OCR1BH=0x06;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

wudi 发表于 2007-7-30 10:10:41

如果受力了抖动不受力不抖,那就是舵机问题。力气小的一般都会抖

JJLuo 发表于 2007-8-18 09:11:21

个人觉得是舵机的供电电压低了点 加点电压试试<8V都没事

干扰的可能性不是很大

uboat 发表于 2007-11-26 13:34:12

如果只是控制舵机
不需要
如果还有其他传感器
就要,不然串扰就麻烦了
我们的机器人上就用光电隔离

freerobot 发表于 2007-12-19 16:20:06

我们这里用的电机控制小车子的,用的ATMEGA8就没有出问题啊,

速度大了,或者负载多了,就容易抖动!!

feng_matrix 发表于 2008-1-30 11:29:50

普通航模舵机不用光耦,AVR管脚输出信号电流足够驱动
产生抖动一个可能原因是程序输出量(PWM脉宽)变化速度太快
舵机执行速度跟不上,根据具体舵机的速度加入延时逻辑即可消除

andygongyb 发表于 2008-2-12 21:26:00

数字舵机可以超压吗?里面单片机不知道受不受得了……

zjwhero 发表于 2008-4-19 16:27:12

舵机大多数使用的是PPM信号,也就是只利用了20ms(假定一个周期为20ms)的前1~2ms。与PWM信号还是有区别的。
页: [1]
查看完整版本: 用avr控制舵机,需要光耦之类的隔离吗?