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.程序源代码

程序源代码下载地址

原创粉丝点击