步进电机的单片机控制
想问一下用单片机做过步进电机驱动的朋友几个问题:1。我想用P3口的低四位来做为控制信号的发出端 使用数组的方式编排好要发送的数据,问题是我要如何才能将这4位分立出来且使4个端口同时的发送信号 如P3=0xfe这样的方式整体赋值 但同时又不影响高4位对信号的接收或是发送
2。在用低4位做控制信号的同时,我又想用到外部中断1即P3.3口的边沿触发方式 如何实现这一位的复用
这是我正在做的一个小项目,希望做过的仁兄指点一二,谢谢 我现在在线 希望做过的仁兄分享一下经验 位操作也可以 1.可以这样赋值P3 = P3 & 0xFE;或者P3 &= 0xFE; 3楼正解 首先很感谢大家对我发帖的回复 现在将我实际试验的结果说一下 欢迎交流
01:对于位操作的方式 我keil编译通过后 仿真开始就通不过 实际试验的时候在示波器上看到的也只是P3^0 P3^1有方波产生 而余下的两位不会有任何的反应
02:对于 P3 = P3 & 0xFE;或者P3 &= 0xFE的方式 没有试验过
我将尽快将试验的结果附上,含原理图 源程序 欢迎交流意见 谢谢
感觉这个论坛上的氛围比较好,希望和大家真诚交流 一起成长 可以使用下现成的驱动控制芯片点击此处下载 ourdev_573599.rar(文件大小:677K) (原文件名:TMC428 Technical Information.rar)
点击此处下载 ourdev_573600.rar(文件大小:610K) (原文件名:TMC246 technical information.rar) 用状态机实现 #include <stc11f02.h> //2010年4月20 先点亮LED,然后在驱动步进电机
#define uchar unsigned char
#define uintunsigned int
//sfr WDT_CONTR =0xc1;
sbit led_red= P1^6; //sbit KAI= P3^2; 1为亮,0为不亮
sbit led_blue= P1^7; //sbit TING = P3^3; 1为亮,0为不亮
sbit led_green= P1^5; //1为亮,0为不亮
sbit S1= P1^4;
sbit S2= P1^3;
sbit S3= P1^2;
sbit S4= P1^1;
sbit vin= P3^7; //声控0为LM358音频输入,1为无音频输入
uchar motor_speed;
uchar motor_step;
uchar flag;
void init(void);
void delay500ms(void)
{
unsigned char j,k;
for(j=40;j>0;j--)
for(k=42;k>0;k--);
}
static void time0(void) interrupt 1 using 1 //T0中断函数
{
TH0 = 0x50; /*计数初值重装*/
TL0 = 0x00;
WDT_CONTR = 0x3c;
motor_speed++; //重要点注意了,此参数决定电机的速度和步进
led_red = !led_red;
}
static void time1(void) interrupt 3 using 2 //T0中断函数
{
TH1 = 0x00; /*计数初值重装*/
TL1 = 0x00;
WDT_CONTR = 0x3c;
if(vin == 0)
{
flag = !flag;
}
led_blue = !led_blue;
}
void motor_stop(void)
{
S1 = 0;
S2 = 0;
S3 = 0;
S4 = 0;
WDT_CONTR = 0x3c;
}
void phasicA(void)
{
S1 = 1;
S2 = 0;
S3 = 0;
S4 = 0;
}
void phasicB(void)
{
S1 = 0;
S2 = 1;
S3 = 0;
S4 = 0;
}
void phasicC(void)
{
S1 = 0;
S2 = 0;
S3 = 1;
S4 = 0;
}
void phasicD(void)
{
S1 = 0;
S2 = 0;
S3 = 0;
S4 = 1;
}
void motor_right(uchar speed)
{
if(motor_speed >= speed)
{
motor_speed = 0;
motor_step++;
}
switch(motor_step)
{
case 0:
phasicA();
break;
case 1:
phasicB();
break;
case 2:
phasicC();
break;
case 3:
phasicD();
break;
default:
motor_step = 0;
break;
}
}
void motor_left(uchar speed)
{
if(motor_speed >= speed)
{
motor_speed = 0;
motor_step++;
}
switch(motor_step)
{
case 0:
phasicD();
break;
case 1:
phasicC();
break;
case 2:
phasicB();
break;
case 3:
phasicA();
break;
default:
motor_step = 0;
break;
}
}
main()
{
init();
led_green = 1;
//led_red = 0;
motor_stop();
WDT_CONTR = 0x3c;
while(1)
{
if(flag)
{
motor_left(1);
}
else
{
motor_right(1);
}
WDT_CONTR = 0x3c;
}
}
void init(void)
{
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P1 = 0x00;
delay500ms();
TMOD = 0x11; /*T0工作在定时器方式1*/
TH0 = 0xcb; /*预置计数初值*/
TL0 = 0xeb;
TH1 = 0xcF;
TL1 = 0xcA;
PCON = 0x00;
SCON = 0x9C;
EA = 1; //CPU开中断
ET0 = 1; /*T0开中断*/
ET1 = 1;
TR0 = 1; /*启动T0*/
TR1 = 1;
} 这个好像叫4相4拍吧,4相8拍的震动会小点 电机控制俺是外行,做个电机风扇消暑 哈哈 先留个记号 再次感谢大家的帮助,最近手头有别的活,一时也没有时间去深入做这件事情,等过段时间我将手头A/D D/A卡的事情完成之后,这个项目我还是要继续的,我非常乐意将我在学习过程的经验与教训与大家一起分享,共同提高进步。 在此特别感谢 bj-stm8 不知不觉,后知后觉仁兄对这个问题的持续关注而且还给出了参考程序。谢谢 顶,嘻嘻 mark kj 貌似程序注释再清晰点就完美了,我是新手,有的还是看得不大明白。谢谢楼主无私分享!!! mark 标记下先!!! 看程序 我还得看 注释 标记
页:
[1]