674|4

117

帖子

0

TA的资源

一粒金砂(高级)

【TMC2208评测测评】电机转起来 [复制链接]

在经历烧掉一块Bluepill和一块TMC2208驱动板之后,电机终于转起来了.

WeChat_20250303085649

 

测试硬件环境:

Bluepill一块

TMC2208驱动板一块

LM2596电源模块一块

合宙DAPlink仿真器

 

本次代码主要由deepseek协助完成.

我将我的要求提供给了deepseek.首先帮我生成代码框架

image.png  

 

image.png  

但是它生成的代码是基于HAL库.我的STM32F103的代码是基于标准库的.于是要求用标准库重新写

image.png  

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

// 精确延时函数(基于72MHz主频)
void Delay_us(uint32_t us) {
    us *= 72; // 72 cycles per microsecond
    while(us--) __asm__("nop");
}

void GPIO_Configuration(void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    
    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);

    // 配置STEP引脚(PA8)
    GPIO_InitStructure.GPIO_Pin = STEP_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置EN引脚(PA9,开漏输出)
    GPIO_InitStructure.GPIO_Pin = EN_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_ResetBits(GPIOA, EN_PIN);  // 默认使能驱动器

    // 配置DIR引脚(PA10)
    GPIO_InitStructure.GPIO_Pin = DIR_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置微步引脚(PB6/PB7)
    GPIO_InitStructure.GPIO_Pin = MS1_PIN | MS2_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// 设置微步模式(0-全步,1-1/2步,2-1/4步,3-1/8步)
void SetMicrostep(uint8_t mode) {
    switch(mode) {
        case 0: // 全步
            GPIO_ResetBits(GPIOB, MS1_PIN);
            GPIO_ResetBits(GPIOB, MS2_PIN);
            break;
        case 1: // 1/2步
            GPIO_SetBits(GPIOB, MS1_PIN);
            GPIO_ResetBits(GPIOB, MS2_PIN);
            break;
        case 2: // 1/4步
            GPIO_ResetBits(GPIOB, MS1_PIN);
            GPIO_SetBits(GPIOB, MS2_PIN);
            break;
        case 3: // 1/8步
            GPIO_SetBits(GPIOB, MS1_PIN);
            GPIO_SetBits(GPIOB, MS2_PIN);
            break;
    }
}

// 发送单个脉冲(最小脉宽1us)
void SingleStep(void) {
    GPIO_SetBits(GPIOA, STEP_PIN);
    Delay_us(1);         // 保持高电平至少1us
    GPIO_ResetBits(GPIOA, STEP_PIN);
    Delay_us(1);         // 低电平保持
}

// 连续步进控制
void Stepping(uint32_t steps, uint8_t direction, uint16_t speed_us) {
    GPIO_WriteBit(GPIOA, DIR_PIN, direction ? Bit_SET : Bit_RESET);
    
    for(uint32_t i=0; i<steps; i++) {
        SingleStep();
        if(speed_us > 2) Delay_us(speed_us - 2); // 补偿脉冲时间
    }
}

int main(void) {
    SystemInit();
    GPIO_Configuration();
    
    SetMicrostep(3); // 使用1/8微步
    while(1) {
        Stepping(200, 1, 1000);  // 正转200步,1ms/步
        Delay_us(500000);        // 暂停500ms
        Stepping(200, 0, 1000);  // 反转200步,1ms/步
        Delay_us(500000);
    }
}

image.png  

代码注释清晰,并给出了解释.非常的不错

这样一个简单的基于GPIO翻转发送脉冲的步进电机控制程序就完成了.代码复制进我现有的项目中.就能跑起来了.

主要代码如下.


// 精确延时函数(基于72MHz主频)
void Delay_us(uint32_t us)
{
  us *= 72; // 72 cycles per microsecond
  while (us--) __asm__("nop");
}
void GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  // Enable GPIOA and GPIOB clock
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
  // 配置STEP引脚(PA8)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  // 配置EN引脚(PA9,开漏输出)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  // 配置DIR引脚(PA10)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  // 配置微步引脚(PB6/PB7)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

// 设置微步模式(0-1/8,1-1/2步,2-1/4步,3-1/16步)
void SetMicrostep(uint8_t mode)
{
  switch (mode) {
  case 0: // 1/8步
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    GPIO_ResetBits(GPIOB, GPIO_Pin_7);
    break;
  case 1: // 1/2步
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    GPIO_ResetBits(GPIOB, GPIO_Pin_7);
    break;
  case 2: // 1/4步
    GPIO_ResetBits(GPIOB, GPIO_Pin_6);
    GPIO_SetBits(GPIOB, GPIO_Pin_7);
    break;
  case 3: // 1/16步
    GPIO_SetBits(GPIOB, GPIO_Pin_6);
    GPIO_SetBits(GPIOB, GPIO_Pin_7);
    break;
  }
}

void StepperMotor_Step(uint16_t steps, uint8_t direction)
{
  uint16_t i;
  if (direction)
    GPIO_ResetBits(GPIOA, GPIO_Pin_10); // DIR low
  else
    GPIO_SetBits(GPIOA, GPIO_Pin_10); // DIR high
  for (i = 0; i < steps; i++) {
    GPIO_SetBits(GPIOA, GPIO_Pin_8); // STEP high
    Delay_us(10); // Adjust the delay for your step frequency
    GPIO_ResetBits(GPIOA, GPIO_Pin_8); // STEP low
    Delay_us(10); // Adjust the delay for your step frequency
  }
  //GPIO_SetBits(GPIOA, GPIO_Pin_9);
}
int main()
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* 使能 PWR 和 BKP 外设时钟 */
  PWR_BackupAccessCmd(ENABLE); /* 使能后备寄存器访问 */
  BKP_WriteBackupRegister(BKP_DR1, 0); /* 向指定的后备寄存器中写入用户程序数据 */
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
  GpioInit(GPIO_LED, GPIO_Speed_50MHz, GPIO_Mode_Out_PP);
  UartInit(0, 115200);
  GPIO_Config();
  GPIO_ResetBits(GPIOA, GPIO_Pin_9);  // 默认使能驱动器
  SetMicrostep(0);
  printf("System is running\r\n");
  while (1) {
    StepperMotor_Step(200 * 8, 1);  // 正转1600步
    Delay_us(50000);        // 暂停500ms
    StepperMotor_Step(200 * 8, 0);  // 反转1600步
    Delay_us(50000);
  }
}

还是发现AI生成的细分设置代码是错误的

image.png  

这段代码和手册说明不一致.

 

由于本次测评,并不是一个完整的可运行硬件环境,所以过程比较坎坷.电源问题还烧坏了板子,那一种青烟袅绕...

环境搭起来了,下一步改用PWM模式控制测试一下加减速功能.

 

 

此帖出自电机控制论坛

最新回复

nmg
你上传后,没点击插入吧?   详情 回复 发表于 2025-2-28 19:45

回复
举报

117

帖子

0

TA的资源

一粒金砂(高级)

哎,视频怎么看不到

此帖出自电机控制论坛

点评

nmg
你上传后,没点击插入吧?  详情 回复 发表于 2025-2-28 19:45

回复

7497

帖子

2

TA的资源

版主

deepseek可以直接解析pdf啊

此帖出自电机控制论坛

回复

117

帖子

0

TA的资源

一粒金砂(高级)

是的呀.直接把芯片的手册丢给他就行了.

此帖出自电机控制论坛

回复

5279

帖子

239

TA的资源

管理员

flyaqiao 发表于 2025-2-27 18:09 哎,视频怎么看不到

你上传后,没点击插入吧?

此帖出自电机控制论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表