登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 步进电机

[复制链接]
发表于 2022-1-22 17:15:15 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 步进电机
开始时间: 2022-01-21
结束时间: 2022-01-22
学习步进电机的基本构造,现在一般情况下都是永磁式步进电机永磁式可以分为四相八拍这个可以根据构造来了解主要是通过通电后利用磁铁来吸引转子从而从而使其转动起来。
一般的工作模式是八拍及六十四拍使其转动。
同时通过其控制顺序表能使其转动起来。
下面是将矩阵键盘与步进电机相结合

按键1~9是控制圈数,上键与下键分别控制向上与向下,左右键控制旋转左右90度,ESC🗡控制退出
与加法计算机有异曲同工之妙[dog]
#include<reg52.h>
sbit KEY_OUT_1=P1^7;
sbit KEY_OUT_2=P1^6;
sbit KEY_OUT_3=P1^5;
sbit KEY_OUT_4=P1^4;
sbit KEY_IN_1=P1^3;
sbit KEY_IN_2=P1^2;
sbit KEY_IN_3=P1^1;
sbit KEY_IN_4=P1^0;

unsigned char code KeyCodeMap[4][4]={
{0x31,0x32,0x33,0x26},
{0x34,0x35,0x36,0x25},
{0x37,0x38,0x39,0x28},
{0x30,0x1B,0x0D,0x27}
};

unsigned char keysta[4][4]={
{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
};

signed char beats=0;
void KeyDriver();
void main()
{
EA=1;
        TMOD=0x01;
        TH0=0xFC;
        TL0=0x67;
        TR0=1;
        ET0=1;
        while(1)
        {
        KeyDriver();
        }
}
void StartMonter(signed long angle)
{
EA=0;
        beats=(angle*4076)/360;
        EA=1;
}
void StopMonter()
{
EA=0;
        beats=0;
        EA=1;
}

void KeyAction(unsigned char keycode)
{
static  bit  dirmonter=0;
        if(keycode>=0x30&&keycode<=0x39)
        {
        if(dirmonter==0)
        {
        StartMonter(360*(keycode-0x30));
        }
        else
        {
                StartMonter(-360*(keycode-0x30));
        }
        }
        else if(keycode==0x26)
        {
        dirmonter=0;
        }
        else if(keycode==0x28)
        {
        dirmonter=1;
        }
        else if(keycode==0x25)
        {
        StartMonter(90);
        }
        else if(keycode==0x27)
        {
        StartMonter(-90);
        }
        else if(keycode==0x1B)
        {
        StopMonter();
        }
}

void KeyDriver()
{
unsigned char i,j;
        static unsigned char backup[4][4]={
        {1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}
        };
        for(i=0;i<4;i++)
        {
        for(j=0;j<4;j++)
                {
                if(backup[i][j]!=keysta[i][j])
                {
                if(backup[i][j]==1)
                {
                KeyAction(KeyCodeMap[i][j]);
                }
                backup[i][j]=keysta[i][j];
                }
                }
        }
}
void KeyScan()
{
unsigned char i;
        static  unsigned char keyout=0;
        static  unsigned char  keybuff[4][4]={
        {0xFF,0xFF,0xFF,0xFF},        {0xFF,0xFF,0xFF,0xFF},
                {0xFF,0xFF,0xFF,0xFF},        {0xFF,0xFF,0xFF,0xFF}
        };
          keybuff[keyout][0]=(keybuff[keyout][0]<<1) | KEY_IN_1;
                keybuff[keyout][1]=(keybuff[keyout][1]<<1) | KEY_IN_2;
                keybuff[keyout][2]=(keybuff[keyout][2]<<1) | KEY_IN_3;
                keybuff[keyout][3]=(keybuff[keyout][3]<<1) | KEY_IN_4;
        for(i=0;i<4;i++)
        {
       
        if((keybuff[keyout][i]&0x0F)==0x00)
        {
        keysta[keyout][i]=0;
        }
        else if((keybuff[keyout][i]&0x0F)==0x0F)
        {
        keysta[keyout][i]=1;
        }
}
         keyout++;
        if(keyout>4)
        {
        keyout=0;
        }
        switch(keyout)
        {
                  case 0:KEY_OUT_1=0;KEY_OUT_2=1;KEY_OUT_3=1;KEY_OUT_4=1;break;
                        case 1:KEY_OUT_1=1;KEY_OUT_2=0;KEY_OUT_3=1;KEY_OUT_4=1;break;
                        case 2:KEY_OUT_1=1;KEY_OUT_2=1;KEY_OUT_3=0;KEY_OUT_4=1;break;
                        case 3:KEY_OUT_1=1;KEY_OUT_2=1;KEY_OUT_3=1;KEY_OUT_4=0;break;
                  default:break;       
        }
        }       

void TurnMonter()
{
  unsigned char tmp;
        static unsigned char index=0;
        unsigned char code beatcode[8]={
        0xE,0XC,0xD,0x9,0xB,0x3,0x7,0x6
        };
        if(beats!=0)
        {
        if(beats>0)
        {
        index++;
                if(index>=8)
                {
                index=0;
                }
                beats--;
        }
        else
        {
        index--;
                if(index<=-1)
                {
                index=7;
                }
                beats++;
        }
        tmp=P1;
        tmp=tmp&0xF0;
        tmp=tmp | beatcode[index];
        P1=tmp;
}
        else
        {
                P1=P1 | 0x0F;
        }
        }
void InterruptTimer0() interrupt 1
{
static bit div=0;
        TH0=0xFC;
        TL0=0x67;
        KeyScan();
        div=~div;
        if(div==1)
        {
        TurnMonter();
        }
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表