搜索
bottom↓
回复: 3

AVR控制松下A5伺服驱动器

[复制链接]

出0入0汤圆

发表于 2013-7-20 21:58:29 | 显示全部楼层 |阅读模式
各位大虾,不知谁用Avr控制过松下A5的伺服驱动器,现在出现的问题是我设好伺服收到1000个脉冲就使电机转一圈,先用外中断控制停止,在定时器中发脉冲,一但Z相有信号(接外中断)就停止,在A5中查看发送的脉冲数,每次都很准确,为1000个,但换成由循环发脉冲的话,发1000个脉冲,A5会收到多于1000个脉冲,且误差不确定,不知是怎么回事,哪位大虾遇到过这种情况,能不能帮分析一下。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-7-21 18:13:06 | 显示全部楼层
我刚好用过AVR控制过A5,有段时间了,不太记得了,把你的程序贴出来帮你看下

出0入0汤圆

 楼主| 发表于 2013-7-22 09:01:30 | 显示全部楼层
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
//INT0 计数输入
//PB0  方向
//PD7  脉冲
unsigned char SEG[]={249,129,218,203,163,107,123,193,251,235,
                 253,133,222,207,167,111,127,197,255,239,0};

unsigned int counterplus;
#define SETSEG PORTC|=(1<<PC5)
#define CLRSEG PORTC&=~(1<<PC5)
#define SETRCK PORTC|=(1<<PC0)
#define CLRRCK PORTC&=~(1<<PC0)
#define SETSCK PORTC|=(1<<PC1)
#define CLRSCK PORTC&=~(1<<PC1)

unsigned char disp[4]={0,0,0,0};

void watchdog_init(void)
{
        WDR();
        WDTCR = 0x1F;
        WDTCR = 0x0F;
}

void counttoled(unsigned int value)
{
        disp[1] = (value%1000)/100;
        disp[2] = (value%100)/10;
        disp[3] = value%10;
}

void Send595(unsigned char location)
{
        unsigned char seg, i;
        PORTC |= 0X1C;
        seg = SEG[disp[location]];
        CLRRCK;        CLRSCK;
        for(i=0; i<8; i++)
        {
                       if(((seg>>i)&0x01) == 1) SETSEG;
                   else CLRSEG;
                SETSCK; CLRSCK;
               }
        SETRCK; CLRRCK;
        switch(location)
        {
                case 1: PORTC &= 0XF7; break;
                case 2: PORTC &= 0XEF; break;
                case 3: PORTC &= 0XFB; break;
        }
}

void display(void)
{
        static unsigned char i;
        i++; i%=4;
        Send595(i);
}

void port_init(void)
{
        DDRD=0x80; PORTD=0X77;
            DDRC=0XFF; PORTC=0X08;
            DDRB=0XFD; PORTB=0x83;
}

void init_devices(void)
{
        port_init();
        TIMSK = 0x61;//定时器0,2中断,输入捕获
        TCNT1=0;
        MCUCR=0x0F;//INT1、INT0上升沿触发
        GICR=0xc0;//INT1、INT0中断允许
        TCCR0 = 4;//f/8
        TCCR2 = 4;
}

unsigned char TICKETS;
#pragma interrupt_handler INT1_isr:3
void INT1_isr(void)
{
}

#pragma interrupt_handler INT0_isr:2
void INT0_isr(void)
{
}

#pragma interrupt_handler T2_isr:5
void T2_isr(void)
{
        TCNT2=0xb2; //5ms
        display();
}
unsigned int counter2=0;
#pragma interrupt_handler T0_isr:10
void T0_isr(void)
{
        counterplus++;
}

void scankey(void)
{
        unsigned char key, i;
        unsigned int value;
        unsigned int s1, s2;
        key=PINB&0x02;
        if(key!=0x02)
        {
                for(i=100; i>0; i--);
                if(key==(PINB&0x02))
                {
                        while(key==(PINB&0x02)) WDR();
                        if((key&0x02)==0)
                        {
                                for(value=0; value<2000; value++)
                                {
                                        PORTD&=0x7f;
                                        for(s1=0; s1<1000; s1++) {WDR(); NOP();}
                                        PORTD|=0x80;
                                        for(s1=0; s1<1000; s1++) {WDR(); NOP();}
                                }
                        }
                }
        }
}

void main(void)
{
        CLI();
        watchdog_init();
        port_init();
        init_devices();
        SEI();
        counterplus=0;
        counttoled(0);
        PORTB|=0x01;
        counter2=0;
        PORTD|=0x80;
        TICKETS=39;
        TCCR0=4;
        while(1)
        {
                counttoled(counterplus);
                scankey();
                WDR();
        }
}

在scankey函数里用循环发送1000个脉冲,但用A5的显示功能显示接收的脉冲,会收到1002至1010个脉冲不等,不知是怎么回事。

出0入0汤圆

发表于 2013-7-25 11:04:29 | 显示全部楼层
应该是你的中断停止控制不及时造成的。因为当你循环发送脉冲的时候是要接到停止信号才停止的,而你发定数脉冲的时候是发完就停的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表