fangqiu9717 发表于 2019-4-19 09:32:38

肯请大师提供比较完整的步进电机(直流电机)C语言代码

肯请大师提供比较完整的步进电机(直流电机)C语言代码。学生正在学习STM8电机控制程序。想看真正实用的程序(用STM板上按键加电机控制芯片来对电机部分进行控制)。

mmuuss586 发表于 2019-4-19 09:44:18

:)
你在与非网站搜下,很多的;

toofree 发表于 2019-4-19 12:18:14

本帖最后由 toofree 于 2019-4-19 12:45 编辑

步进电机不能叫直流电机。
一般所说的直流电机是指有刷直流电机,磁体固定,线圈在转;
步进电机更像是无刷直流电机,永磁体在转,线圈固定。

用的哪种步进电机和对应的驱动电路?
一般常用的入门学习步进电机有,2相4线4拍,3相4线6拍(或3拍),这两种的驱动电路是完全不同的。

ph0330 发表于 2019-4-21 10:35:54

請參考 https://www.stmcu.org.cn/module/forum/thread-616647-1-1.html

qsazx874 发表于 2019-4-22 17:22:28

写的很菜,用的STD库,但是稍微改一下就能用
/*这是步进电机驱动程序,本程序使用STM8S003F3系列单片机的 【GPIOC】外设
* 需要占用的GPIO管脚分别是:GPIOC 3~6
* 步进电机逆时针旋转,八拍方式驱动,线序为:A、AB、B、BC、C、CD、D、DA
* 步进电机步脚距7.5/85度,减速比1/85
*/

#include "moto_driver.h"

unsigned int steps = 0;//定义变量:总部步数

void moto_timer_init(void)//使用定时器4,
{
    CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4,ENABLE);//使能TIMER4外设时钟
   
    TIM4_DeInit();//恢复TIME4寄存器默认值
    TIM4_TimeBaseInit(TIM4_PRESCALER_128,80);//设置预分频数128,,计数器初值256,256/(16M/8/128)= 60.1hz
    TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//向上溢出中断,中断函数向量号为25
    TIM4_SetCounter(0x00);//
    TIM4_ARRPreloadConfig(ENABLE);
    TIM4_Cmd(DISABLE);
    //TIM4_Cmd(ENABLE);//使能TIME4,参数ENABLE、DISABLE
    //enableInterrupts();//使能中断总开关
}

void moto_pin_init(void)//电机驱动IO初始化,开漏输出:PC3\PC4\PC5\PC6
{
    GPIO_DeInit(GPIOC);
    GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_HIGH_SLOW);
    GPIO_Init(GPIOC,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_SLOW);
    GPIO_Init(GPIOC,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_SLOW);
    GPIO_Init(GPIOC,GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_SLOW);
}

void steps_0(void)//步进0:1000
{
    GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
    GPIO_WriteLow(GPIOC,GPIO_PIN_4);
    GPIO_WriteLow(GPIOC,GPIO_PIN_5);
    GPIO_WriteLow(GPIOC,GPIO_PIN_6);
}

void steps_1(void)//步进1:1100
{
    GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_4);
    GPIO_WriteLow(GPIOC,GPIO_PIN_5);
    GPIO_WriteLow(GPIOC,GPIO_PIN_6);
}

void steps_2(void)//步进2:0100
{
    GPIO_WriteLow(GPIOC,GPIO_PIN_3);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_4);
    GPIO_WriteLow(GPIOC,GPIO_PIN_5);
    GPIO_WriteLow(GPIOC,GPIO_PIN_6);
}

void steps_3(void)//步进3:0110
{
    GPIO_WriteLow(GPIOC,GPIO_PIN_3);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_4);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
    GPIO_WriteLow(GPIOC,GPIO_PIN_6);
}

void steps_4(void)//步进4:0010
{
    GPIO_WriteLow(GPIOC,GPIO_PIN_3);
    GPIO_WriteLow(GPIOC,GPIO_PIN_4);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
    GPIO_WriteLow(GPIOC,GPIO_PIN_6);
}

void steps_5(void)//步进5:0011
{
    GPIO_WriteLow(GPIOC,GPIO_PIN_3);
    GPIO_WriteLow(GPIOC,GPIO_PIN_4);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
}

void steps_6(void)//步进6:0001
{
    GPIO_WriteLow(GPIOC,GPIO_PIN_3);
    GPIO_WriteLow(GPIOC,GPIO_PIN_4);
    GPIO_WriteLow(GPIOC,GPIO_PIN_5);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
}

void steps_7(void)//步进7:1001
{
    GPIO_WriteHigh(GPIOC,GPIO_PIN_3);
    GPIO_WriteLow(GPIOC,GPIO_PIN_4);
    GPIO_WriteLow(GPIOC,GPIO_PIN_5);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
}

void moto_off(void)//刹车停止电机运转函数
{
    TIM4_Cmd(DISABLE);//关闭定时器
    TIM4_SetCounter(0x00);//清零定时器计数值

    GPIO_WriteHigh(GPIOC,GPIO_PIN_3);//刹车堵转
    GPIO_WriteHigh(GPIOC,GPIO_PIN_4);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_5);
    GPIO_WriteHigh(GPIOC,GPIO_PIN_6);
}

void moto_on(void)//启动电机运转函数
{
    TIM4_SetCounter(0x00);//清零定时器计数值
    TIM4_Cmd(ENABLE);//开启定时器
}

void moto_run(char steps_)//电机单步运转函数,传入总步数
{
switch(steps_ % 8)//单步细分
{
      case 0:steps_0();break;
      case 1:steps_1();break;
      case 2:steps_2();break;
      case 3:steps_3();break;
      case 4:steps_4();break;
      case 5:steps_5();break;
      case 6:steps_6();break;
      case 7:steps_7();break;
}
}

void moto_init(void)
{
steps = 0;
moto_pin_init();
moto_timer_init();
}
页: [1]
查看完整版本: 肯请大师提供比较完整的步进电机(直流电机)C语言代码