关于应用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,但奇怪的是,每次卡壳并不在固定的转速或时间上。麻烦高手指点。
以上是为了大家看得方便 精简过的程序。 另有完整程序是通过4*4键盘加上12864带字库液晶够成人机界面的简易离心机控制程序
点击此处下载 ourdev_658085PFHJDM.rar(文件大小:4K) (原文件名:xxx.rar)
由于能力有限让大家见笑了还请高手帮忙分析分析 大虾们·· 坐等你们出现啊~!! 问题解决的了是中断优先级弄错了·· 晕~~
页:
[1]