zhuyunzhi_sz 发表于 2010-8-5 21:19:22

步进电机的单片机控制

想问一下用单片机做过步进电机驱动的朋友几个问题:
1。我想用P3口的低四位来做为控制信号的发出端 使用数组的方式编排好要发送的数据,问题是我要如何才能将这4位分立出来且使4个端口同时的发送信号    如P3=0xfe这样的方式整体赋值 但同时又不影响高4位对信号的接收或是发送
2。在用低4位做控制信号的同时,我又想用到外部中断1即P3.3口的边沿触发方式 如何实现这一位的复用
这是我正在做的一个小项目,希望做过的仁兄指点一二,谢谢

zhuyunzhi_sz 发表于 2010-8-5 21:21:00

我现在在线 希望做过的仁兄分享一下经验

bj-stm8 发表于 2010-8-5 21:57:36

位操作也可以

jamesyu 发表于 2010-8-5 22:31:08

1.可以这样赋值P3 = P3 & 0xFE;或者P3 &= 0xFE;

grash 发表于 2010-8-6 08:25:48

3楼正解

zhuyunzhi_sz 发表于 2010-8-7 02:04:02

首先很感谢大家对我发帖的回复 现在将我实际试验的结果说一下 欢迎交流
01:对于位操作的方式 我keil编译通过后 仿真开始就通不过 实际试验的时候在示波器上看到的也只是P3^0 P3^1有方波产生 而余下的两位不会有任何的反应
02:对于 P3 = P3 & 0xFE;或者P3 &= 0xFE的方式 没有试验过

我将尽快将试验的结果附上,含原理图 源程序 欢迎交流意见 谢谢

感觉这个论坛上的氛围比较好,希望和大家真诚交流 一起成长

TRINAMIC 发表于 2010-8-7 22:18:43

可以使用下现成的驱动控制芯片点击此处下载 ourdev_573599.rar(文件大小:677K) (原文件名:TMC428 Technical Information.rar)
点击此处下载 ourdev_573600.rar(文件大小:610K) (原文件名:TMC246 technical information.rar)

bj-stm8 发表于 2010-8-10 21:18:10

用状态机实现

bj-stm8 发表于 2010-8-10 21:21:00

#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;
}

bj-stm8 发表于 2010-8-10 21:21:59

这个好像叫4相4拍吧,4相8拍的震动会小点

bj-stm8 发表于 2010-8-10 21:25:24

电机控制俺是外行,做个电机风扇消暑 哈哈

zhuyi25762 发表于 2010-8-11 15:17:49

先留个记号

zhuyunzhi_sz 发表于 2010-8-11 23:55:44

再次感谢大家的帮助,最近手头有别的活,一时也没有时间去深入做这件事情,等过段时间我将手头A/D D/A卡的事情完成之后,这个项目我还是要继续的,我非常乐意将我在学习过程的经验与教训与大家一起分享,共同提高进步。

zhuyunzhi_sz 发表于 2010-8-11 23:58:03

在此特别感谢 bj-stm8 不知不觉,后知后觉仁兄对这个问题的持续关注而且还给出了参考程序。谢谢

mkzlovedamy 发表于 2010-8-17 17:06:05

顶,嘻嘻

tongyf 发表于 2010-11-20 16:44:52

mark

engine_er 发表于 2010-11-20 22:11:12

kj

kkalizee 发表于 2010-11-21 14:10:08

貌似程序注释再清晰点就完美了,我是新手,有的还是看得不大明白。谢谢楼主无私分享!!!

pan90 发表于 2011-1-5 20:45:32

mark

wjsh0826 发表于 2011-2-26 15:53:40

标记下先!!!

tomatowo 发表于 2011-5-11 10:38:50

看程序 我还得看 注释

hmzwm 发表于 2011-6-5 16:19:21

标记
页: [1]
查看完整版本: 步进电机的单片机控制