步进电机=GPIO STM32 uln2003






第一种办法 定义TIMEBT10的时候转动会更快 能看到流水灯的 几乎常量了
代码如下
借此机会练习 集中控制

void ctl_only_PA1(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA2(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA3(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA4(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

#define TIMEBT    100
void MotorCW( void )
{
    ctl_only_PA1();    HAL_Delay(TIMEBT);
    ctl_only_PA2();    HAL_Delay(TIMEBT);
    ctl_only_PA3();    HAL_Delay(TIMEBT);
    ctl_only_PA4();    HAL_Delay(TIMEBT);
}


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

	SHOWME
  while (1)
  {
    /* USER CODE END WHILE */
     MotorCW();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


方法2

void ctl_only_PA1(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

}
void ctl_only_PA2(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA3(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
void ctl_only_PA4(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

#define TIMEBT    1000
void MotorCW( void )
{
    ctl_only_PA1();    HAL_Delay(TIMEBT);
    ctl_only_PA2();    HAL_Delay(TIMEBT);
    ctl_only_PA3();    HAL_Delay(TIMEBT);
    ctl_only_PA4();    HAL_Delay(TIMEBT);
}


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

	SHOWME
  while (1)
  {
    /* USER CODE END WHILE */
     MotorCW();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END
  
  方法3
  
void ctl_only_PA1(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

}

void ctl_only_PA12(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

}
void ctl_only_PA2(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA23(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA3(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
}
void ctl_only_PA34(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
void ctl_only_PA4(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}
void ctl_only_PA41(void)
{
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

#define TIMEBT    1
void MotorCW( void )
{
    ctl_only_PA1();    HAL_Delay(TIMEBT);
        ctl_only_PA12();    HAL_Delay(TIMEBT);
    ctl_only_PA2();    HAL_Delay(TIMEBT);
        ctl_only_PA23();    HAL_Delay(TIMEBT);
    ctl_only_PA3();    HAL_Delay(TIMEBT);
        ctl_only_PA34();    HAL_Delay(TIMEBT);
    ctl_only_PA4();    HAL_Delay(TIMEBT);
        ctl_only_PA41();    HAL_Delay(TIMEBT);
}


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

	SHOWME
  while (1)
  {
    /* USER CODE END WHILE */
     MotorCW();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

https://detail.tmall.com/item.htm?id=41303683115&ali_refid=a3_430582_1006:1109983619:N:UpvGo5+Uk3YFP2Kf89RvMw==:1b87efd2480c708b3ea3500b8d61ac6b&ali_trackid=1_1b87efd2480c708b3ea3500b8d61ac6b&spm=a230r.1.14.11

https://blog.csdn.net/qq_20222919/article/details/111604261

准备PA1-2-3-4 对应IN1 2 3 4控制电机

就是流水灯

充电宝给步进电机驱动器上电 它本质是放大电路

需要4个GPIO即可

集中控制
void ctl_only_PA1(void)
{
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
    GPIOA->BSRR = GPIO_PIN_1|((GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4)<<16);
}
void ctl_only_PA2(void)
{
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
        GPIOA->BSRR = GPIO_PIN_2|((GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4)<<16);
}
void ctl_only_PA3(void)
{
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
            GPIOA->BSRR = GPIO_PIN_3|((GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4)<<16);
}
void ctl_only_PA4(void)
{
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
//    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
                GPIOA->BSRR = GPIO_PIN_4|((GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3)<<16);
}

#define TIMEBT    4
void MotorCW( void )
{
    ctl_only_PA1();    HAL_Delay(TIMEBT);
    ctl_only_PA2();    HAL_Delay(TIMEBT);
    ctl_only_PA3();    HAL_Delay(TIMEBT);
    ctl_only_PA4();    HAL_Delay(TIMEBT);
}


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

	SHOWME
  while (1)
  {
    /* USER CODE END WHILE */
     MotorCW();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

结论

uln2003 是放大芯片 没有啥别的 IO可以驱动电机了 以前就是LED

也就是电机是比LED稍微高阶一点点的东西 简单的

++++++++++++++PI+++++++++++++++

树莓派操作 也是一样 的

方式1 比较慢

package main

import (
	"fmt"
	"github.com/stianeikeland/go-rpio/v4"
	"os"
	"time"
)

var (
	pin1 = rpio.Pin(26)
    pin2 = rpio.Pin(19)
    pin3 = rpio.Pin(13)
    pin4 = rpio.Pin(6)
)

func in1(){
pin1.Write(1) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(0) 
}
func in2(){
pin1.Write(0) 
pin2.Write(1) 
pin3.Write(0) 
pin4.Write(0) 
}
func in3(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(1) 
pin4.Write(0) 
}
func in4(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(1) 
}
func main() {
	// Open and map memory to access gpio, check for errors
	if err := rpio.Open(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Unmap gpio memory when done
	defer rpio.Close()

	// Set pin to output mode
    pin1.Output()
    pin2.Output()
    pin3.Output()
    pin4.Output()

	// Toggle pin 20 times
	for x := 0; x < 200; x++ {
    in1()
    time.Sleep(time.Second / 100)
    in2()
    time.Sleep(time.Second / 100)
    in3()
    time.Sleep(time.Second / 100)
    in4()
    time.Sleep(time.Second / 100)     
	}
}

下面方式2抖动小一点 也不是很快

package main

import (
	"fmt"
	"github.com/stianeikeland/go-rpio/v4"
	"os"
	"time"
)

var (
	pin1 = rpio.Pin(26)
    pin2 = rpio.Pin(19)
    pin3 = rpio.Pin(13)
    pin4 = rpio.Pin(6)
)

func in1(){
pin1.Write(1) 
pin2.Write(1) 
pin3.Write(0) 
pin4.Write(0) 
}
func in2(){
pin1.Write(0) 
pin2.Write(1) 
pin3.Write(1) 
pin4.Write(0) 
}
func in3(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(1) 
pin4.Write(1) 
}
func in4(){
pin1.Write(1) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(1) 
}
func main() {
	// Open and map memory to access gpio, check for errors
	if err := rpio.Open(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Unmap gpio memory when done
	defer rpio.Close()

	// Set pin to output mode
    pin1.Output()
    pin2.Output()
    pin3.Output()
    pin4.Output()

	// Toggle pin 20 times
	for x := 0; x < 200; x++ {
    in1()
    time.Sleep(time.Second / 100)
    in2()
    time.Sleep(time.Second / 100)
    in3()
    time.Sleep(time.Second / 100)
    in4()
    time.Sleep(time.Second / 100)     
	}
}

方式3 抖动比较大 也很慢

package main

import (
	"fmt"
	"github.com/stianeikeland/go-rpio/v4"
	"os"
	"time"
)

var (
	pin1 = rpio.Pin(26)
    pin2 = rpio.Pin(19)
    pin3 = rpio.Pin(13)
    pin4 = rpio.Pin(6)
)

func part1(){
pin1.Write(1) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(0) 
}
func part2(){
pin1.Write(1) 
pin2.Write(1) 
pin3.Write(0) 
pin4.Write(0) 
}
func part3(){
pin1.Write(0) 
pin2.Write(1) 
pin3.Write(0) 
pin4.Write(0) 
}
func part4(){
pin1.Write(0) 
pin2.Write(1) 
pin3.Write(1) 
pin4.Write(0) 
}
func part5(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(1) 
pin4.Write(0) 
}
func part6(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(1) 
pin4.Write(1) 
}
func part7(){
pin1.Write(0) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(1) 
}
func part8(){
pin1.Write(1) 
pin2.Write(0) 
pin3.Write(0) 
pin4.Write(1) 
}
func main() {
	// Open and map memory to access gpio, check for errors
	if err := rpio.Open(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	// Unmap gpio memory when done
	defer rpio.Close()

	// Set pin to output mode
    pin1.Output()
    pin2.Output()
    pin3.Output()
    pin4.Output()

	// Toggle pin 20 times
	for x := 0; x < 200; x++ {
    part1()
    time.Sleep(time.Second / 100)
        part2()
    time.Sleep(time.Second / 100)
        part3()
    time.Sleep(time.Second / 100)
        part4()
    time.Sleep(time.Second / 100)   
    part5()
    time.Sleep(time.Second / 100)
        part6()
    time.Sleep(time.Second / 100)
        part7()
    time.Sleep(time.Second / 100)
        part8()
    time.Sleep(time.Second / 100)    
	}
}

优化代码

package main
 
import (
	"fmt"
	"github.com/stianeikeland/go-rpio/v4"
	"os"
	"time"
)
 
var (
	pin1 = rpio.Pin(26)
    pin2 = rpio.Pin(19)
    pin3 = rpio.Pin(13)
    pin4 = rpio.Pin(6)
)

func setStep(a rpio.State,b rpio.State,c rpio.State,d rpio.State){
pin1.Write(a) 
pin2.Write(b) 
pin3.Write(c) 
pin4.Write(d)
}
 
func main() {
	// Open and map memory to access gpio, check for errors
	if err := rpio.Open(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
 
	// Unmap gpio memory when done
	defer rpio.Close()
 
	// Set pin to output mode
    pin1.Output()
    pin2.Output()
    pin3.Output()
    pin4.Output()
 
	// Toggle pin 20 times
	for x := 0; x < 200; x++ {
    setStep(1,1,0,0)
    time.Sleep(time.Second / 500)
    setStep(0,1,1,0)
    time.Sleep(time.Second / 500)
    setStep(0,0,1,1)
    time.Sleep(time.Second / 500)
    setStep(1,0,0,1)
    time.Sleep(time.Second / 500)     
	}
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值