⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianji_s.c

📁 单片机实现的遥控小汽车的设计研究论文与程序
💻 C
字号:
////////////////////////////////////////////////////////////////////
//文件名:dianji.c
//功能描述:从单片机上旋转机构驱动模块
////////////////////////////////////////////////////////////////////
#include "reg52.h"
#include "dianji_s.h"
#include "timer0_s.h"

#define uchar unsigned char
#define uint unsigned int

sbit ROUND_MID=P3^4; //旋转机构中点检测端
sbit ROUND_CE=P3^5;  //步进电机驱动芯片控制端
sbit ROUND_A=P3^7;
sbit ROUND_B=P3^6;

//////////////////////////////////////////////////////////////////
data int degree=0; //需要转到的角度
data int nowdegree=0; //目前所处角度
bdata bit temp_mid;//暂存ROUND_MID,用来校正角度值

//////////////////////////////////////////////////////////////////
//局部函数声明
void round_step1(void); //顺时针旋转一步
void round_step2(void); //逆时针旋转一步


///////////////////////////////////////////////////////////////////////
//旋转步进电机驱动
void driver_dianji(void)
{
        static bdata bit flag_close=0;

        //以下几行使步进电机驱动芯片的CE端占空比为50%
        if(flag_close)
        {
                flag_close=0;
                ROUND_CE=1;
                return;
        }
        else
        {
                flag_close=1;
        }
        //以下部分没8ms执行一次
        if(nowdegree==degree)
        {
                ROUND_CE=1;      //转到指定角度则关闭电机
                return ;
        }

        ROUND_CE=0;              //未转到指定位置则打开电机
        if(nowdegree>degree)     //需要逆时针旋转
        {
                round_step1();
                nowdegree--;
                //角度校正
                if((!temp_mid)&&ROUND_MID)nowdegree=DEGREE_MID;
                else if(temp_mid&&(!ROUND_MID))nowdegree=DEGREE_MID+4;
        }
        else                    //需要顺时针旋转
        {
                round_step2();
                nowdegree++;
                //角度校正
                if(temp_mid&&(!ROUND_MID))nowdegree=DEGREE_MID;
                else if((!temp_mid)&&ROUND_MID)nowdegree=DEGREE_MID+4;
        }

}

data uchar flag_round;//步进电机状态标识
///////////////////////////////////////////////////////////////////
//顺时针转一步1/520圈
void round_step1(void)
{
        switch(flag_round)
        {
                case 0:
                       ROUND_A=0;
                       ROUND_B=0;
                       break;
                case 1:
                       ROUND_A=1;
                       ROUND_B=0;
                       break;
                case 2:
                       ROUND_A=1;
                       ROUND_B=1;
                       break;
                case 3:
                       ROUND_A=0;
                       ROUND_B=1;
                       break;
         }
         flag_round++;
         flag_round&=0x03;
}
//////////////////////////////////////////////////////////////////
//逆时针转一步
void round_step2(void)
{
        switch(flag_round)
        {
                case 0:
                       ROUND_A=0;
                       ROUND_B=0;
                       break;
                case 1:
                       ROUND_A=0;
                       ROUND_B=1;
                       break;
                case 2:
                       ROUND_A=1;
                       ROUND_B=1;
                       break;
                case 3:
                       ROUND_A=1;
                       ROUND_B=0;
                       break;
         }
         flag_round++;
         flag_round&=0x03;

}

////////////////////////////////////////////////////////////////////
//初始化电机,达到同步并找到0度角
void initdianji(void)
{
        temp_mid=ROUND_MID;
        setdegree(4); //使步进电机进入同步状态
        delay_ms(200);
        setdegree(0);
        delay_ms(200);
        setdegree(40); //先在小范围内寻找原点
        while(getnowdegree()!=40)
        {
                if(ROUND_MID)
                {
                        setdegree(0);
                        return;
                }
        }
        delay_ms(200);
        setdegree(-260); //逆时针旋转以校正原点
        while(getnowdegree()!=(-260))
        {
                if(ROUND_MID)
                {
                        setdegree(0);
                        return;
                }
        }
        delay_ms(200);
        setdegree(260);
        while(getnowdegree()!=260)   //顺时针旋转以校正原点
        {
                if(ROUND_MID)
                {
                        setdegree(0);
                        return;
                }
        }
}

///////////////////////////////////////////////////////////////////////
//旋转到指定的角度-300~300
//单位为步数
//传感器转一圈需要520步
void setdegree(int dg)
{
        if(dg<(-400))return;
        else if(dg>400)return;
        else
        {
                degree=dg;
        }
}
///////////////////////////////////////////////////////////////////
//将转动机构转到指定的角度后返回
void roundto(int dg)
{
        if(dg<(-400))return;
        if(dg>400)return;
        degree=dg;
        while(nowdegree!=degree);
}
//////////////////////////////////////////////////////////////////
//返回当前的角度值
int getnowdegree(void)
{
        return nowdegree;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -