这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32驱动简单型步进电机的源码

共7条 1/1 1 跳转至

STM32驱动简单型步进电机的源码

工程师
2020-07-21 22:04:40     打赏

STM32驱动简单型步进电机的源码,仅供参考!


#include "motor.h"  //导入led头文件
#include "stm32f10x.h"  //导入STM32官方库
#include "stm32f10x_rcc.h"  //导入STM32的RCC时钟库
#include "delay.h"       //延时库

void RCC_Configuration(void)
{
  SystemInit();
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE , ENABLE);
}

{
  GPIO_InitTypeDef GPIO_InitStructure;                                //端口配置结构体

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                        //PD3管脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口      

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                        //PD6管脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口      

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                //PD12管脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz
  GPIO_Init(GPIOD, &GPIO_InitStructure);                        //初始化端口      

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                        //PE4管脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //口线翻转速度为50MHz
  GPIO_Init(GPIOE, &GPIO_InitStructure);                        //初始化端口      


}
//电机正转函数
void ZhengZhuan(u16 tt)
{
            //1000         
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
              //1100
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
              //0100
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //0110  
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
                  //0010  
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //0011
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //0001
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
                  //1001
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
}
//电机反转函数
void FanZhuan(u16 tt)
{
          //1001         
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
                  //0001
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //0011
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_SetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //0010  
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);        
          //0110
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_SetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
                  //0100
          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //1100
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_SetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);
          //1000         
          GPIO_SetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
          delay_ms1(tt);                  
}

void delay_ms1(u16 nms)
{
         u32 temp;
         SysTick->LOAD = 9000*nms;
         SysTick->VAL=0X00;//清空计数器
         SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
         do
         {
          temp=SysTick->CTRL;//读取当前倒计数值
         }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
         SysTick->CTRL=0x00; //关闭计数器
         SysTick->VAL =0X00; //清空计数器
}

main.c
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "misc.h"
//#include "delay.h"

void RCC_Configuration(void);
void GPIO_Configuration(void);
void ZhengZhuan(u16 tt);
void FanZhuan(u16 tt);
void delay_ms1(u16 nms);


int main(void)
{
  RCC_Configuration();        //系统时钟设置及外设时钟使能                  
  GPIO_Configuration();
  //delay_init();  //延时函数初始化

        while (1)
                 {
                // ZhengZhuan(3);//逆时针                              
            
                 FanZhuan(10);//顺时针
               
            
                 }

          GPIO_ResetBits(GPIOD, GPIO_Pin_3);
          GPIO_ResetBits(GPIOD, GPIO_Pin_6);
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);
          GPIO_ResetBits(GPIOE, GPIO_Pin_4);
  //}
}




关键词: STM32     步进电机     电机     源码    

工程师
2020-07-21 22:31:02     打赏
2楼

配有相应的电路图就更好了~


工程师
2020-07-21 22:34:23     打赏
3楼

正好需要用到~ 能否上传工程文件,谢谢!


工程师
2020-07-21 22:39:55     打赏
4楼

这是四相八拍来驱动吧!


四相八拍:也叫做半步:A---AB---B---BC---C---CD---D---DA,再次从头循环。

四相:指步进电机中有四组线圈,八拍:指的是四组线圈的通电时序。



工程师
2020-07-22 10:14:12     打赏
5楼

感谢你的分享


菜鸟
2020-07-24 14:41:56     打赏
6楼

好好学习!


菜鸟
2020-07-29 21:38:30     打赏
7楼

真是优秀


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]