stm32f103rct6基于标准库和两个TB6600同时控制两个42步进电机同时运行的代码
时间: 2023-10-03 09:03:22 浏览: 100
STM32F103单片机 HAL库编程. 四轴42步进电机旋转控制实现
5星 · 资源好评率100%
以下是基于标准库的stm32f103rct6控制两个TB6600驱动42步进电机同时运行的代码:
```c
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
#define TB6600_EN1_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_EN1_GPIO_PORT GPIOB
#define TB6600_EN1_GPIO_PIN GPIO_Pin_0
#define TB6600_DIR1_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_DIR1_GPIO_PORT GPIOB
#define TB6600_DIR1_GPIO_PIN GPIO_Pin_1
#define TB6600_PUL1_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_PUL1_GPIO_PORT GPIOB
#define TB6600_PUL1_GPIO_PIN GPIO_Pin_10
#define TB6600_EN2_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_EN2_GPIO_PORT GPIOB
#define TB6600_EN2_GPIO_PIN GPIO_Pin_12
#define TB6600_DIR2_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_DIR2_GPIO_PORT GPIOB
#define TB6600_DIR2_GPIO_PIN GPIO_Pin_13
#define TB6600_PUL2_GPIO_CLK RCC_APB2Periph_GPIOB
#define TB6600_PUL2_GPIO_PORT GPIOB
#define TB6600_PUL2_GPIO_PIN GPIO_Pin_14
void TB6600_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(TB6600_EN1_GPIO_CLK | TB6600_DIR1_GPIO_CLK | TB6600_PUL1_GPIO_CLK | TB6600_EN2_GPIO_CLK | TB6600_DIR2_GPIO_CLK | TB6600_PUL2_GPIO_CLK, ENABLE);
// TB6600_EN1
GPIO_InitStructure.GPIO_Pin = TB6600_EN1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_EN1_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(TB6600_EN1_GPIO_PORT, TB6600_EN1_GPIO_PIN);
// TB6600_DIR1
GPIO_InitStructure.GPIO_Pin = TB6600_DIR1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_DIR1_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(TB6600_DIR1_GPIO_PORT, TB6600_DIR1_GPIO_PIN);
// TB6600_PUL1
GPIO_InitStructure.GPIO_Pin = TB6600_PUL1_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_PUL1_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(TB6600_PUL1_GPIO_PORT, TB6600_PUL1_GPIO_PIN);
// TB6600_EN2
GPIO_InitStructure.GPIO_Pin = TB6600_EN2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_EN2_GPIO_PORT, &GPIO_InitStructure);
GPIO_SetBits(TB6600_EN2_GPIO_PORT, TB6600_EN2_GPIO_PIN);
// TB6600_DIR2
GPIO_InitStructure.GPIO_Pin = TB6600_DIR2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_DIR2_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(TB6600_DIR2_GPIO_PORT, TB6600_DIR2_GPIO_PIN);
// TB6600_PUL2
GPIO_InitStructure.GPIO_Pin = TB6600_PUL2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(TB6600_PUL2_GPIO_PORT, &GPIO_InitStructure);
GPIO_ResetBits(TB6600_PUL2_GPIO_PORT, TB6600_PUL2_GPIO_PIN);
}
void TB6600_Run(uint8_t dir1, uint8_t dir2, uint32_t steps)
{
uint32_t i;
if (dir1)
GPIO_SetBits(TB6600_DIR1_GPIO_PORT, TB6600_DIR1_GPIO_PIN);
else
GPIO_ResetBits(TB6600_DIR1_GPIO_PORT, TB6600_DIR1_GPIO_PIN);
if (dir2)
GPIO_SetBits(TB6600_DIR2_GPIO_PORT, TB6600_DIR2_GPIO_PIN);
else
GPIO_ResetBits(TB6600_DIR2_GPIO_PORT, TB6600_DIR2_GPIO_PIN);
for (i = 0; i < steps; i++)
{
GPIO_SetBits(TB6600_PUL1_GPIO_PORT, TB6600_PUL1_GPIO_PIN);
delay_us(5);
GPIO_ResetBits(TB6600_PUL1_GPIO_PORT, TB6600_PUL1_GPIO_PIN);
delay_us(5);
GPIO_SetBits(TB6600_PUL2_GPIO_PORT, TB6600_PUL2_GPIO_PIN);
delay_us(5);
GPIO_ResetBits(TB6600_PUL2_GPIO_PORT, TB6600_PUL2_GPIO_PIN);
delay_us(5);
}
}
int main()
{
TB6600_GPIO_Init();
while(1)
{
TB6600_Run(1, 1, 200); // 两个电机顺时针转200步
delay_ms(500);
TB6600_Run(0, 0, 200); // 两个电机逆时针转200步
delay_ms(500);
}
}
```
其中,`delay.h`和`delay.c`是用于延时的库文件,可自行编写或从网络上下载。该代码中,`TB6600_GPIO_Init()`函数用于初始化GPIO,`TB6600_Run()`函数用于控制两个电机的转动方向和步数,`main()`函数用于循环控制两个电机的运行。在实际使用过程中,需要根据电机的步距角和细分方式,计算出所需的步数和转动方向。
阅读全文