STM32F767+TB6600+57步进电机(升级版)
来源:互联网 发布:星巴克糕点搭配知乎 编辑:程序博客网 时间:2024/06/09 14:24
1.按键外部中断
exti.c:
#include "exti.h"#include "delay.h"#include "led.h"#include "key.h"#include "usart.h"void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ delay_ms(50); //消抖 switch(GPIO_Pin) { case GPIO_PIN_2: if(KEY1==0) //停止 len=2; break; case GPIO_PIN_3: if(KEY0==0) //反转 { LED0(1); len=1; } break; case GPIO_PIN_13: if(KEY2==0) //正转 { LED0(0); len=0; } break; }}
exti.h:
#ifndef _EXTI_H#define _EXTI_H#include "sys.h"void EXTI_Init(void); //外部中断初始化#endif
2.串口通信
usart.c:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ if(huart->Instance==USART1)//如果是串口1 { if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } if(USART_RX_STA&0x8000) { USART_RX_STA=0; switch(USART_RX_BUF[0]) { case 0x0A: //zhengzhuan len=0; LED0(0); break; case 0x0B: //tinzhi len=2; break; case 0x0C: //fanzhuan LED0(1); len=1; break; } }}
usart.h:
extern u8 len;
这里有一个extern的全局变量,在usart.h中声明,usart.c中定义,那么在main.c中只需要#include“usart.h”即可,在exti.c中只需要#include“usart.h”即可。
3.定时器控制转速
如果没有添加HAL库文件的话,赶紧右键添加到hallib,如图:
timer.c:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim==(&TIM3_Handler)) { LED1_Toggle; //LED0反转 }}
4.主函数
main.c:
#include "sys.h"#include "delay.h"#include "usart.h"#include "led.h"#include "exti.h"#include "timer.h"int main(void){ Cache_Enable(); //打开L1-Cache HAL_Init(); //初始化HAL库 Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz delay_init(216); //延时初始化 uart_init(115200); //串口初始化 LED_Init(); //初始化LED EXTI_Init(); //外部中断初始化 while(1) { if(len==0) { HAL_TIM_Base_Stop_IT(&TIM3_Handler); TIM3_Init(50-1,10800-1); //5ms printf("电机正转!\r\n\r\n");//插入换行 len=3; } else if(len==1) { HAL_TIM_Base_Stop_IT(&TIM3_Handler); TIM3_Init(50-1,10800-1); printf("电机反转!\r\n\r\n");//插入换行 len=3; } else if(len==2) { HAL_TIM_Base_Stop_IT(&TIM3_Handler); printf("电机停止!\r\n\r\n");//插入换行 len=3; } } // delay_ms(1000);// HAL_TIM_Base_Stop_IT(&TIM3_Handler);}
最后的两行是用来测试转180度角的,2*5ms=10ms=1.8°步距角,1000ms=180°步距角,刚好转半圈后关闭定时器。
5.实验效果
6.程序源代码
程序源代码下载地址
阅读全文
1 0
- STM32F767+TB6600+57步进电机(升级版)
- STM32F767+TB6600+57步进电机
- 利用Arduino+TB6600驱动模块控制两相四线42减速步进电机
- 步进电机基础知识(转载)
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 步进电机
- 57BYGH420步进电机解释 57系列
- 57BYGH420步进电机单片机程序
- xml自定义实体
- java设计模式:责任链模式
- python关键字
- reqiure js 详解(二)
- ZOJ
- STM32F767+TB6600+57步进电机(升级版)
- 在 Linux/Unix/Mac 下清除 DNS 查询缓存
- 接口
- matlab2016a 中载入VLFeat 失败~
- Linux 用户管理和权利下放
- HDU
- TCP定时器
- 【C++】【内附前辈贴】浅谈指针的指针
- Chrome 控制台console的用法