找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1142|回复: 0
打印 上一主题 下一主题
收起左侧

步进电机的测试STM32程序

[复制链接]
跳转到指定楼层
楼主
ID:531679 发表于 2019-5-9 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//头文件调用
#include "usually.h"
#include "usart.h"
#include "rtc.h"

//声明变量
extern struct Data_Time  timer;
extern int MC_state;
extern int Delay_time;
extern uint16_t MC_count;
extern int YK1_state; //遥控变位记录
extern int YK2_state;
extern int YK3_state;
extern int YK4_state;
extern int YK5_state;

extern int Alarm_state;

//函数申明
void Init_LED(void);
void Init_NVIC(void);
void Delay(vu32 nCount);
void Delay_Ms(uint16_t time);  
void Delay_Us(uint16_t time);
void Delay_all(uint8_t count);
void hard_Init_Test(void);
void FK_Control_Deal(int _MC_state);
void moto_step(int a1,int a2,int b1,int b2,int t);
void one_step_Z(int t);
void one_step_F(int t);

void Alarm_Voice();
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: main
** 功能描述: 主函数入口
** 参数描述:无
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
int main(void)
{
        uint8_t t=0;
        SystemInit();                                //系统时钟配置
        Init_NVIC();                                //中断向量表注册函数
        Init_Usart();                                //串口引脚配置
        Usart_Configure(9600);        //串口配置 设置波特率为115200
        Init_LED();                                        //LED初始化
        Init_RTC();                                        //内部RTC初始化
        //Time_Update(2013,6,26,0,0,0);
        //uint8_t ReceiveDate;
        hard_Init_Test();//硬件初始化测试
        Alarm_Voice(6,200,200);        
        while(1)
        {
                int for_while=52;
                while(for_while-->0)
                {
                        one_step_F(500);
                }
                Delay_Ms(2000);
                for_while=52;
                while(for_while-->0)
                {
                        one_step_Z(500);
                        moto_step(0,0,0,0,0);
                }               
                Delay_Ms(2000);
        }
//                 Delay_Ms(5);
//                 if(Alarm_state==0)
//                 {
//                         Alarm_Voice(8,200,100);
//                         Alarm_state=3;
//                 }
//                 else
//                 {
//                         if(Alarm_state==1)
//                         {
//                                 Alarm_Voice(3,200,1);
//                                 Alarm_state=3;
//                         }
//                         else
//                         {
//                                 LED2=1;
//                         }
//                 }

//                 if(t!=timer.sec)
//                 {
//                                 t=timer.sec;
//                                 LED1=~LED1;
//                                 LED2=~LED2;                                                
//                 }        
        //}               
}

void one_step_Z(int t)
{
        moto_step(1,0,0,0,t);//A+
        moto_step(1,0,1,0,t);//A+B+
        moto_step(0,0,1,0,t);//B+
        moto_step(0,1,1,0,t);//A-B+
        moto_step(0,1,0,0,t);//A-
        moto_step(0,1,0,1,t);//A-B-
        moto_step(0,0,0,1,t);//B-
        moto_step(1,0,0,1,t);//A+B-
}

void one_step_F(int t)
{
        moto_step(1,0,0,1,t);//A+B-
        moto_step(0,0,0,1,t);//B-
        moto_step(0,1,0,1,t);//A-B-
        moto_step(0,1,0,0,t);//A-
        moto_step(0,1,1,0,t);//A-B+
        moto_step(0,0,1,0,t);//B+
        moto_step(1,0,1,0,t);//A+B+        
        moto_step(1,0,0,0,t);//A+        
}

void moto_step(int a1,int a2,int b1,int b2,int t)
{
        YX1=a1;
        YX2=a2;
        YX3=b1;
        YX4=b2;
        Delay_Us(t);
}

void Alarm_Voice(int _t1,int _t2,int _t3)
{
        int i=0;
        for(i=0;i<_t1;i++)
        {
                LED2=0;
                Delay_Ms(_t2);
                LED2=1;
                Delay_Ms(_t3);
        }
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: 负控处理函数
** 功能描述: 主函数入口
** 参数描述:无
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void FK_Control_Deal(int _MC_state)
{
                int i=0;        
                if(_MC_state != 0)        //脉冲输入                                                                                                
                {
                        for(i=0;i<MC_count*2;i++)
                        {
                                Delay_Ms(Delay_time*100);
                                switch((int)_MC_state)
                                {
                                        case 1:
                                                {
                                                        MC1=~MC1;
                                                }break;
                                        case 2:
                                                {
                                                        MC2=~MC2;
                                                }break;                                                        
                                        case 3:
                                                {
                                                        MC3=~MC3;
                                                }break;
                                        case 4:
                                                {
                                                        MC4=~MC4;
                                                }break;                                                        
                                        case 0x12:
                                                {
                                                        MC1=~MC1;
                                                        MC2=~MC2;
                                                }break;                                                               
                                        case 0x13:
                                                {
                                                        MC1=~MC1;
                                                        MC3=~MC3;
                                                }break;                                                        
                                        case 0x14:
                                                {
                                                        MC1=~MC1;
                                                        MC4=~MC4;
                                                }break;                                                        
                                        case 0x23:
                                                {
                                                        MC2=~MC2;
                                                        MC3=~MC3;
                                                }break;                                                               
                                        case 0x24:
                                                {
                                                        MC2=~MC2;
                                                        MC4=~MC4;
                                                }break;                                                               
                                        case 0x34:
                                                {
                                                        MC3=~MC3;
                                                        MC4=~MC4;
                                                }break;                                       
                                        case 0x33:
                                                {
                                                        MC1=~MC1;
                                                        MC2=~MC2;
                                                        MC3=~MC3;
                                                }break;                                                
                                        case 0x44:
                                                {
                                                        MC1=~MC1;
                                                        MC2=~MC2;
                                                        MC3=~MC3;
                                                        MC4=~MC4;
                                                }break;
                                        default:break;
                                }
                        }
                        MC_count=0;
                        MC_state=0;
                }
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: hard_Init_Test
** 功能描述:
** 参数描述:无
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void hard_Init_Test()
{
        LED1=0;
        LED2=1;
        GPIO_ResetBits(GPIOA, GPIO_Pin_4);
        YX1=0;
        YX2=1;
        YX3=0;
        YX4=0;
        YX5=0;
        //YX6=0;
        //YX7=0;

        MC1=0;
        MC2=0;
        MC3=0;
        MC4=0;
        Delay_all(10);
        YX1=1;
        //YX2=1;
        YX3=1;
        YX4=1;
        YX5=1;
        //YX6=1;
        //YX7=1;

        MC1=1;
        MC2=1;
        MC3=1;
        MC4=1;
        Delay_all(10);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: LED_Init
** 功能描述: LED IO引脚配置
** 参数描述:无
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Init_LED(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                                                                                        //定义一个GPIO结构体变量
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);        //使能各个端口时钟,重要!!!        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 ;             //配置LED端口挂接到6、12、13端口
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   //通用输出推挽
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                   //配置端口速度为50M
          GPIO_Init(GPIOC, &GPIO_InitStructure);                                           //将端口GPIOD进行初始化配置

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7
                |GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                        
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //  下拉输出
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;                        
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //  上拉输入
        //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: NVIC_Configuration
** 功能描述: 系统中断配置
** 参数描述:无
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Init_NVIC(void)
{         
        NVIC_InitTypeDef NVIC_InitStructure;

        #ifdef  VECT_TAB_RAM                                                                          //向量表基地址选择

          NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);                          //将0x20000000地址作为向量表基地址(RAM)
        #else  

          NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);                 //将0x08000000地址作为向量表基地址(FLASH)  
        #endif
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);                //先占优先级1位,从优先级3位

        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//USART1_IRQn;;                //RTC全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;        //先占优先级1位,从优先级3位
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //先占优先级0位,从优先级4位
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能该通道中断
        NVIC_Init(&NVIC_InitStructure);                //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                //RTC全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //先占优先级1位,从优先级3位
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //先占优先级0位,从优先级4位
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能该通道中断
        NVIC_Init(&NVIC_InitStructure);
}
void Delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

void Delay_all(uint8_t count)
{
        int i=0;
        for(i=0;i<count;i++)
        {
                Delay(0xfffff);
        }
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Delay_Ms_Ms
** 功能描述: 延时1MS (可通过仿真来判断他的准确度)                        
** 参数描述:time (ms) 注意time<65535
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Delay_Ms(uint16_t time)  //延时函数
{
        uint16_t i,j;
        for(i=0;i<time;i++)
                  for(j=0;j<10260;j++);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
** 函数名称: Delay_Ms_Us
** 功能描述: 延时1us (可通过仿真来判断他的准确度)
** 参数描述:time (us) 注意time<65535                                 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/
void Delay_Us(uint16_t time)  //延时函数
{
        uint16_t i,j;
        for(i=0;i<time;i++)
                  for(j=0;j<9;j++);
}
/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
End:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D:-D
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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