STM32F103C8T6利用串口指令和按键控制28BYJ-48步进电机

参考这里面的某楼

https://www.amobbs.com/thread-5651668-1-1.html?_dsign=3ea969b0

   我在main函数的while循环中参考上述代码,写了STM32适用的代码,让电机转了,但是它停不下来啊!

于是参考了下图,连接找不到了,嘤~,参考第二位仁兄的意见,设置标志位,终于!按键可以让它停下来了!

工具:keil5,

          STM32cubemx配置串口,按键中断等,

           STM32F103C8T6,

           CH340串口转USB,

           步进电机及ULN2003驱动板

我的关键代码:

//变量

uint8_t motorflag = 0; //定义标志位

uint8_t Tx_str1[] = "hello world!\r\n"; //用于发送的字符串
uint8_t Rx_dat = 0;   // 接收

//用到的函数

//电机正转函数ab-bc-cd-da-ab-..
void motor_forward(){
      uint32_t i = 100; //其实这里我也搞不懂这个计数有啥用
    while(i){
             i--;
            
             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);
           HAL_Delay(3);
           
           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);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
           HAL_Delay(3);
        
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
           HAL_Delay(3);
        
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
           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_Delay(3);
            
        }
        
}

//电机反转函数 和上面序列相反
void motor_reverse(){
      uint32_t i = 100;
    while(i){
             i--;
            
             HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
           HAL_Delay(3);
           
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
           HAL_Delay(3);
        
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
           HAL_Delay(3);
        
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
           HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
           HAL_Delay(3);     
        }  
}

//按键中断回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
   if(GPIO_Pin==GPIO_PIN_0){
         motorflag = 0;     //按键停止电机转动
           HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);   //翻转电平,为了想看到有个反应,非必要代码(以下皆是)
     }
}
    

//串口非阻塞接收回调函数    

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
   if(huart->Instance == USART1){
        if(Rx_dat == 0xa1){
                 HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
                 motorflag = 1;       //十六进制指令“A1”,修改标志位
                 HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
            }
            else if(Rx_dat == 0xa2){
                 HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
                 motorflag = 2;      //十六进制指令“A2”,修改标志位
                 HAL_UART_Receive_IT(&huart1,&Rx_dat,1);
            }
     }

       

main函数中加入以下语句

    //非阻塞接收十六进制指令
    HAL_UART_Receive_IT(&huart1,&Rx_dat,1);


  while (1)中加入:


        if(motorflag == 1){   //标志位为1,使电机正转
             motor_forward();
        }
        else if(motorflag == 2){  //标志位为2,使电机反转
              motor_reverse();
        }
        

发送A1,电机正转,中间需要按键停下再,发送A2,电机反转,
写的代码比较菜,希望大神有更好的意见,是否可以用指令控制电机停呢?第一次发博客,还请多多包涵,大家一起交流!

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值