gxy5494 发表于 2011-7-15 13:52:38

关于应用STC12C5A602S控制伺服控制器的问题~ 求教高手~

小弟用STC12C5A602S单片机做了一块简单的伺服控制器控制板   用来发生33.3KHZ以下的脉冲
伺服电机每转一圈需要10000个脉冲我想通过脉冲频率来控制伺服电机的速度和加速度
速度的算法很简单啦,除就行了   然后加速度就是通过每100MS改变一次脉冲频率来获得于是有了下面这个程序
然后问题出现了运转时如果加速时间超过5秒(也就是加速时间参数大于50)。就会随机出现1到3次卡壳的现象。由于是伺服电机 制动强度比较大 所以特别明显。但时间很短。用示波器看,大概每次都是1/10秒没有脉冲输出。

#include <STC12C5A.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define WEIGOU WDT_CONTR=0x3c

sbit maikou=P3^5;

void init();
void yunsuan2(uchar bzcs);

bit bz5=0;
uint a,a2,b,v,atime,t,mai,maijia,maizhong,bushu,n=0,m=0;
unsigned long xxx;
uint xdata shuju=
{
        0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0
};//通过改变数组值来得到不通的工作状态分为10组 每组3个 第一个为速度单位是转/分 第二个加速时间单位是1/10秒 第三个是运转时间单位是秒

void main()
{
        init();
        while(1)
        {               
                WEIGOU;
        }       
}

void init()         
{
        a=0;
        a2=0;
        b=0;
        AUXR=0x80;
        TH0=(256-b);
        TL0=(256-b);
        TH1=(65536-39965)/256;
        TL1=(65536-39965)%256;
        TMOD=0x12;
        PT0=0;
        PT1=1;
        EA=1;
        ET0=1;
        ET1=1;
        yunsuan2(0);//分十组数据存
        TR1=1;
        TR0=1;
        WEIGOU;
}

void yunsuan2(uchar bzcs)
{
        v=shuju;
        atime=shuju;
        t=shuju;
        bushu=atime;
        maijia=(v*10)/(6*atime);
        mai=maijia;
        xxx=240000/mai;
        if(xxx>=256)
        {
                a=a2=xxx/256;
                b=xxx%256;
        }
        else
        {
                a=a2=0;
                b=xxx;
        }
}

void t0() interrupt 1
{
        maikou=1;
        if(a==a2)
        {
                TH0=256-b;
                a=0;
                maikou=0;       
        }
        else       
        {
                TH0=0;
                a++;       
        }
}

void t1() interrupt 3
{
        TH1=(65536-39965)/256;
        TL1=(65536-39965)%256;
        m++;
        if(m==5)
        {
                if(bushu>1)
                {
                        mai=mai+maijia;
                        xxx=240000/mai;
                        if(xxx>256)
                        {
                                a=a2=xxx/256;
                                b=xxx%256;
                        }
                        else
                        {
                                a=a2=0;
                                b=xxx;
                        }
                        bushu--;
                }
                else if(bushu==1)
                {
                        xxx=144000/v;
                        if(xxx>256)
                        {
                                a=a2=xxx/256;
                                b=xxx%256;
                        }
                        else
                        {
                                a=a2=0;
                                b=xxx;
                        }
                        bushu--;
                }
                n++;
                if(n==(t*10))
                {
                        TR0=0;
                        TR1=0;
                        n=0;
                        bz5=1;//为了配合人机的标志位现在没有意义
                }
        m=0;
        }               
}

后来我又把加速时间的分辨率调整到了1秒。然后每次卡壳的时间也变长了。

分析觉得应该是程序BUG,但奇怪的是,每次卡壳并不在固定的转速或时间上。麻烦高手指点。

以上是为了大家看得方便 精简过的程序。

gxy5494 发表于 2011-7-15 13:58:51

另有完整程序是通过4*4键盘加上12864带字库液晶够成人机界面的简易离心机控制程序
点击此处下载 ourdev_658085PFHJDM.rar(文件大小:4K) (原文件名:xxx.rar)
由于能力有限让大家见笑了还请高手帮忙分析分析

gxy5494 发表于 2011-7-15 16:07:39

大虾们·· 坐等你们出现啊~!!

gxy5494 发表于 2011-7-20 11:35:09

问题解决的了是中断优先级弄错了·· 晕~~
页: [1]
查看完整版本: 关于应用STC12C5A602S控制伺服控制器的问题~ 求教高手~