|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-11-9 20:32:06
|
显示全部楼层
/*---说明---
此程序是用来控制步进马达加减速的测试程序
感谢阿莫论坛,坛友 ada1983 提供的步进电机加速度曲线表
程序设计思路:利用定时器产生脉冲来控制步进电机的运转
本想用24M的,结果下载板上的是18.432M的,以下是按18.432M的晶振算的...
阿莫论坛:zhuisuoji 点?潇洒.
*/
#include "stc12c2052AD.H"
#define PulNumb 200
#define Isp_Addr_H 0x10
unsigned int Pulseload; //--脉冲频率初值
unsigned char loadaddr; //--脉冲频率初值地址
unsigned char T0CountOV; //--T0溢出数,每2次溢出计壹个脉冲
unsigned int PulCount; //--脉冲数 1(PulCount)=2(T0CountOV);
unsigned char StepCount; //--步数 1(StepCount)=8(PulCount);
unsigned int CycleCount;//--转数 1(CycleCount)=200(StepCount);
//unsigned int PulNumb; //--转数低于
bit AddSub_Speed_f,Direction_f;//--加减速标志,方向标志
sbit key_Input = P1^0;//--启动键
sbit Direction_Out = P3^5;//--方向输出
sbit Pulse_Out = P3^7;//--脉冲输出
/*--原值表说明:8M晶振,2相4线(1.8度)步进电机,2细分,250~3500Hz的加速频率表.
//--(360/1.8)*2=200*2=400个脉冲/转.
//--180脉冲转角度=180*(1.8/2)=180*0.9=162度(达到3500HZ)
//--下表的每个脉冲只走半步,即每半步跳变一次频率,
//--比如:到达250Hz时, 走完一步的频率是 250Hz/2=125Hz
---- 到达3500Hz时,走完一步的频率是 3500Hz/2=1750Hz
unsigned int xdata Pulse180[]={
32000,27352,21959,17755,14987,13241,12003,11065,10321, 9711,
9200, 8762, 8383, 8049, 7753, 7488, 7248, 7031, 6832, 6649,
6480, 6324, 6179, 6043, 5917, 5798, 5686, 5580, 5480, 5386,
5296, 5211, 5129, 5052, 4978, 4907, 4840, 4775, 4712, 4653,
4595, 4540, 4486, 4435, 4385, 4337, 4291, 4246, 4203, 4161,
4120, 4080, 4042, 4005, 3969, 3933, 3899, 3866, 3834, 3802,
3771, 3741, 3712, 3684, 3656, 3629, 3602, 3576, 3551, 3526,
3502, 3478, 3455, 3432, 3410, 3388, 3367, 3346, 3326, 3306,
3286, 3267, 3248, 3229, 3211, 3193, 3176, 3159, 3142, 3125,
3109, 3093, 3077, 3061, 3046, 3031, 3016, 3002, 2988, 2974,
2960, 2946, 2933, 2919, 2906, 2894, 2881, 2869, 2856, 2844,
2832, 2821, 2809, 2798, 2786, 2775, 2764, 2754, 2743, 2733,
2722, 2712, 2702, 2692, 2682, 2672, 2663, 2653, 2644, 2635,
2626, 2617, 2608, 2599, 2591, 2582, 2574, 2565, 2557, 2549,
2541, 2533, 2525, 2517, 2509, 2502, 2494, 2487, 2479, 2472,
2465, 2458, 2451, 2444, 2437, 2430, 2423, 2417, 2410, 2403,
2397, 2391, 2384, 2378, 2372, 2366, 2360, 2354, 2348, 2342,
2336, 2330, 2324, 2319, 2313, 2307, 2302, 2296, 2291, 2286,
};
*/
/*根据上表算出24M,8细分的比较值
计算公式:2细分脉冲频率=8000000/32000=250Hz(半步的频率);
整步频率=250/2=125Hz;
8细分脉冲频率=125*8=1000Hz;
8细分定时器比较值=24000000/1000=24000;
也可以这样算:8细分定时器比较值=((32000*3)*2)/8=24000;
*/
//--24M 8细分的脉冲定时值
//--8细分时每个脉冲走的角度=1.8/8=0.225,走到162度要达到3500Hz,需发脉冲总数为162/0.225=720个8细分脉冲,
//--每个定时值需发脉冲数=720/180=4个8细分脉冲
//--此表每一次中断取反引脚来产生脉冲,二次为一个脉冲周期,
//--每2次中断记录一个脉冲,每4个脉冲换一个定时初值,直到最后一个达到3500Hz的速度,完成启动-->加速-->恒速
//--反之则进行:恒速-->减速-->停止
//--此表是18.432M晶振算的8细分参数,此表加到200个脉冲
unsigned int code PulseTab[]={
56320 , 57659 , 59212 , 60423 , 61220 , 61723 , 62079 , 62349 , 62564 , 62739 ,
62886 , 63013 , 63122 , 63218 , 63303 , 63379 , 63449 , 63511 , 63568 , 63621 ,
63670 , 63715 , 63756 , 63796 , 63832 , 63866 , 63898 , 63929 , 63958 , 63985 ,
64011 , 64035 , 64059 , 64081 , 64102 , 64123 , 64142 , 64161 , 64179 , 64196 ,
64213 , 64228 , 64244 , 64259 , 64273 , 64287 , 64300 , 64313 , 64326 , 64338 ,
64349 , 64361 , 64372 , 64383 , 64393 , 64403 , 64413 , 64423 , 64432 , 64441 ,
64450 , 64459 , 64467 , 64475 , 64483 , 64491 , 64499 , 64506 , 64513 , 64521 ,
64527 , 64534 , 64541 , 64548 , 64554 , 64560 , 64566 , 64572 , 64578 , 64584 ,
64590 , 64595 , 64601 , 64606 , 64611 , 64616 , 64621 , 64626 , 64631 , 64636 ,
64641 , 64645 , 64650 , 64654 , 64659 , 64663 , 64667 , 64671 , 64675 , 64679 ,
64684 , 64688 , 64691 , 64695 , 64699 , 64703 , 64706 , 64710 , 64713 , 64717 ,
64720 , 64724 , 64727 , 64730 , 64734 , 64737 , 64740 , 64743 , 64746 , 64749 ,
64752 , 64755 , 64758 , 64761 , 64764 , 64766 , 64769 , 64772 , 64775 , 64777 ,
64780 , 64782 , 64785 , 64787 , 64790 , 64792 , 64795 , 64797 , 64800 , 64802 ,
64804 , 64806 , 64809 , 64811 , 64813 , 64815 , 64818 , 64820 , 64822 , 64824 ,
64826 , 64828 , 64830 , 64832 , 64834 , 64836 , 64838 , 64840 , 64842 , 64844 ,
64846 , 64847 , 64849 , 64851 , 64853 , 64855 , 64856 , 64858 , 64860 , 64862 ,
64863 , 64865 , 64867 , 64868 , 64870 , 64872 , 64873 , 64875 , 64876 , 64878 ,
64882 , 64884 , 64886 , 64887 , 64889 , 64890 , 64892 , 64893 , 64895 , 64896 ,
64900 , 64902 , 64903 , 64905 , 64906 , 64908 , 64909 , 64911 , 64912 , 64913 ,
};//--此表每个参数T0溢出8次(即8/2个脉冲走半步)更新一次参数.
//---系统初始化
void sys_Initial(void)
{
AUXR = 0xc0;//--1T方式
P1 = 0Xff;
P1M1 = 0x00;//
P1M0 = 0x00;//
P3 = 0Xff;
P3M1 = 0xe0;//1110 0000
P3M0 = 0x00;//0000 0000
}
//---------------------------------------------------------------------
//---定时器0初始化
void TMRx_Initial(unsigned int Cycle)
{
Pulseload = 0; //--脉冲频率初值
loadaddr = 0; //--脉冲频率初值地址
T0CountOV = 0; //--T0溢出数,每2次溢出计壹个脉冲
PulCount = 0; //--脉冲数 1(PulCount)=2(T0CountOV);
StepCount = 0; //--步数 1(StepCount)=8(PulCount);
CycleCount = Cycle; //--转数 1(CycleCount)=200(StepCount);
AddSub_Speed_f = 1; //--启动加速
// TMOD Bit; 7 6 5 4 3 2 1 0
// GATE1 C/T1# M1_1 M1_0 GATE0 C/T0# M0_1 M0_0
TMOD = 0x01;
TL0 = 0;
TH0 = 0;
// TCON Bit; 7 6 5 4 3 2 1 0
// TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
// TCON = 0x10;//TR0 = 1;
// IE Bit; 7 6 5 4 3 2 1 0
// EA EPCA_LVD EADC_SPI ES ET1 EX1 ET0 EX0
IE = 0x82;
TR0=1;
while(CycleCount!=0);
}
//---------------------------------------------------------------------
//---延时程序
/*
void dalay_us(unsigned int mid)
{
unsigned int i;
for ( i=0;i<mid;i++)
;
}
*/
void dalay_1ms(void)
{
unsigned int i;
for ( i=0;i<1000;i++)
;
}
void dalay_ms(unsigned int mid)
{
unsigned int i;
for ( i=0;i<mid;i++)
dalay_1ms();
}
//---主程序---
void main(void)
{
unsigned int time_ms,looptime;
sys_Initial();
CycleCount = 0;//--转数 1(CycleCount)=200(StepCount);
while(1)
{
time_ms=50;
loopus:
if(key_Input==0)//--每按一次键,方向取反
{
dalay_1ms();
if(--time_ms!=0)
{
goto loopus;//--消抖查询
}
if(CycleCount==0)
{
TMRx_Initial(10);//--一个方向转10圈
Direction_Out = ~Direction_Out;//--方向
dalay_ms(100);
looptime=10;
do{
TMRx_Initial(1);//--反向每转1圈停顿10ms,转够10圈返回原点
dalay_ms(10);
}while(--looptime!=0);
}
}
}
}//--main_end;
//--------------------------------------------------------------------
void Timer0_Routine(void)interrupt 1
{
static unsigned int th0_buf;
if((CycleCount==1)&&(StepCount==100))//--转到最后半圈时转入减速程式
{
AddSub_Speed_f = 0;//--启动减速
}
if(++T0CountOV>=2)//每2次溢出计一个脉冲输出
{
if(++PulCount>=8)//每8个脉冲计一步,即走了1.8度
{
if(++StepCount>=200)//每200步为一转
{
if(--CycleCount==0)//总转数减1
{
TR0=0;
}
StepCount=0;
}
PulCount=0;
}
T0CountOV=0;//计完一次脉冲后溢出计数清零
}
if(AddSub_Speed_f)
{
if(PulCount==4)
{
if(loadaddr<PulNumb)
{
Pulseload=PulseTab[loadaddr++];//--启动时加速
}
}
}
else
{
if(PulCount==4)
{
if(loadaddr>0)
{
Pulseload=PulseTab[--loadaddr];//--停止时减速
}
}
}
loopth0:
th0_buf=TH0;
if(th0_buf!=TH0)
{
goto loopth0;
}
th0_buf = Pulseload +((th0_buf<<8)|TL0);//64878
TH0 = th0_buf>>8;
TL0 = th0_buf;
Pulse_Out=~Pulse_Out;//--输出脉冲
} |
|