参考这里面的某楼
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,电机反转,
写的代码比较菜,希望大神有更好的意见,是否可以用指令控制电机停呢?第一次发博客,还请多多包涵,大家一起交流!