单片机平台
正点原子探索者STM32F407
引脚
按键:
控制使能:PE4
控制方向:PE3

讯享网
TIM1的设置

修正:
如果是168分频,这里应该填167。
如果是6分频,这里应该填5。


key_exit.h
#ifndef __KEY_EXTI_H__ #define __KEY_EXTI_H__ #include "MyApplication.h" //定义结构体类型 typedef struct {
uint8_t volatile KEY_Flag; //按键标志位 uint8_t Press_Num; void (*KEY_EXTI_KEY_Detect)(void); //按键检测 } KEY_EXTI_t; /* extern variables-----------------------------------------------------------*/ extern KEY_EXTI_t KEY_EXTI_KEY0; extern KEY_EXTI_t KEY_EXTI_KEY1; #endif
讯享网
key_exit.c
讯享网/* Includes ------------------------------------------------------------------*/ #include "MyApplication.h" volatile Steerper_Motor_Enable_Val_t Steerper_Motor_Enable_Status_Val = Steerper_Motor_No_EN_Val ;//默认不使能 volatile Steeper_Motor_DIR_Val_t Steerper_Motor_Dir_Status_Val = Steerper_Motor_FWD_Val; //默认正转 /* Private function prototypes------------------------------------------------*/ static void KEY_EXTI_KEY0_Detect(void); //按键0检测 static void KEY_EXTI_KEY1_Detect(void); //按键1检测 /* Public variables ----------------------------------------------------------*/ //结构体定义 KEY_EXTI_t KEY_EXTI_KEY0 = {
FALSE,0,KEY_EXTI_KEY0_Detect}; KEY_EXTI_t KEY_EXTI_KEY1 = {
FALSE,0,KEY_EXTI_KEY1_Detect}; /* Private function prototypes--------------------------*/ /* * @ name KEY0_Detect * @ brief 触摸按键0检测 * @ param None * @ retval None */ static void KEY_EXTI_KEY0_Detect(void) //按键0检测 {
if(KEY_EXTI_KEY0.KEY_Flag == TRUE) {
HAL_Delay(10); if(HAL_GPIO_ReadPin(KEY_EXTI_KEY0_GPIO_Port,KEY_EXTI_KEY0_Pin) == GPIO_PIN_SET) {
KEY_EXTI_KEY0.Press_Num++; } if(KEY_EXTI_KEY0.Press_Num == 3) {
KEY_EXTI_KEY0.Press_Num =1; } if(KEY_EXTI_KEY0.Press_Num == 1) {
printf("Steerper Motor Enable.\r\n"); Steerper_Motor.Steerper_Motor_Enable(); Steerper_Motor_Enable_Status_Val=Steerper_Motor_EN_Val; } if(KEY_EXTI_KEY0.Press_Num == 2) {
printf("Steerper Motor Disable.\r\n"); Steerper_Motor.Steerper_Motor_Disable(); Steerper_Motor_Enable_Status_Val=Steerper_Motor_No_EN_Val; } //清除按键0状态 KEY_EXTI_KEY0.KEY_Flag = FALSE; } } /* * @ name KEY1_Detect * @ brief 触摸按键1检测 * @ param None * @ retval None */ static void KEY_EXTI_KEY1_Detect(void) //按键0检测 {
if(Steerper_Motor_Enable_Status_Val == Steerper_Motor_EN_Val) {
if(KEY_EXTI_KEY1.KEY_Flag == TRUE) {
HAL_Delay(10); if(HAL_GPIO_ReadPin(KEY_EXTI_KEY1_GPIO_Port,KEY_EXTI_KEY1_Pin) == GPIO_PIN_SET) {
KEY_EXTI_KEY1.Press_Num++; } if(KEY_EXTI_KEY1.Press_Num == 3) {
KEY_EXTI_KEY1.Press_Num =1; } if(KEY_EXTI_KEY1.Press_Num == 1) {
printf("Steerper Motor REV.\r\n"); Steerper_Motor_Dir_Status_Val=Steerper_Motor_REV_Val; } if(KEY_EXTI_KEY1.Press_Num == 2) {
printf("Steerper Motor FWD.\r\n"); Steerper_Motor_Dir_Status_Val=Steerper_Motor_FWD_Val; } //清除按键1状态 KEY_EXTI_KEY1.KEY_Flag = FALSE; } } }
steeper_motor.h
#ifndef __STEEPER_MOTOR_H__ #define __STEEPER_MOTOR_H__ #include "MyApplication.h" //定义电机运转的方向 typedef enum {
Steerper_Motor_FWD_Val = (uint8_t)1, Steerper_Motor_REV_Val = (uint8_t)0 } Steeper_Motor_DIR_Val_t; typedef enum {
Steerper_Motor_EN_Val = (uint8_t)1, Steerper_Motor_No_EN_Val = (uint8_t)0 } Steerper_Motor_Enable_Val_t; //定义结构体类型 typedef struct {
void (*Steerper_Motor_Enable)(void); //步进电机使能 void (*Steerper_Motor_Disable)(void); //步进电机失能 void (*Steerper_Motor_FWD)(void); //步进电机正转 void (*Steerper_Motor_REV)(void); //步进电机反转 } Steerper_Motor_t; extern Steerper_Motor_t Steerper_Motor; extern void Steerper_Motor_Work(Steeper_Motor_DIR_Val_t Steerper_Motor_DIR_Val); /* 控制步进电机使能引脚 */ /* 高电平使能 */ #define Cotrol_Steerper_Motor_Enable() HAL_GPIO_WritePin(GPIOE, Control_Steeper_EN_Pin, GPIO_PIN_SET) #define Cotrol_Steerper_Motor_Disable() HAL_GPIO_WritePin(GPIOE, Control_Steeper_EN_Pin, GPIO_PIN_RESET) /* 低电**能 */ /* 控制步进电机方向引脚 */ /* 高电平正转 */ // 高电平打开-高电平使能 #define Cotrol_Steerper_Motor_FWD() HAL_GPIO_WritePin(GPIOE, Control_Steeper_Dir_Pin, GPIO_PIN_SET) #define Cotrol_Steerper_Motor_REV() HAL_GPIO_WritePin(GPIOE, Control_Steeper_Dir_Pin, GPIO_PIN_RESET) /* 低电**转 */ /* 控制步进电机脉冲引脚 */ /* 使能比较通道1 */ #define Cotrol_Steerper_Motor_PUL_Enable() TIM_CCxChannelCmd(TIM1, TIM_CHANNEL_1, TIM_CCx_ENABLE) #define Cotrol_Steerper_Motor_PUL_Disable() TIM_CCxChannelCmd(TIM1, TIM_CHANNEL_1, TIM_CCx_DISABLE) /* 失能比较通道1 */ #endif
steeper_motor.c
讯享网#include "MyApplication.h" extern volatile Steerper_Motor_Enable_Val_t Steerper_Motor_Enable_Status_Val ;//默认不使能 extern volatile Steeper_Motor_DIR_Val_t Steerper_Motor_Dir_Status_Val ; //默认正转 void Steerper_Motor_Enable(void); void Steerper_Motor_Disable(void); void Steerper_Motor_FWD(void); void Steerper_Motor_REV(void); Steerper_Motor_t Steerper_Motor = {
Steerper_Motor_Enable, //步进电机正能 Steerper_Motor_Disable, //步进电机失能 Steerper_Motor_FWD , //步进电机正转 Steerper_Motor_REV //步进电机反转 }; //步进电机正能 void Steerper_Motor_Enable(void) {
Cotrol_Steerper_Motor_Enable(); Cotrol_Steerper_Motor_PUL_Enable(); } //步进电机失能 void Steerper_Motor_Disable(void) {
Cotrol_Steerper_Motor_PUL_Disable(); Cotrol_Steerper_Motor_Disable(); } //步进电机正转 void Steerper_Motor_FWD(void) {
Cotrol_Steerper_Motor_FWD(); } //步进电机反转 void Steerper_Motor_REV(void) {
Cotrol_Steerper_Motor_REV(); } //电机工作方向选择 void Steerper_Motor_Work(Steeper_Motor_DIR_Val_t Steerper_Motor_DIR_Val) {
if(Steerper_Motor_Enable_Status_Val == Steerper_Motor_EN_Val) {
switch (Steerper_Motor_DIR_Val) {
case Steerper_Motor_FWD_Val: Steerper_Motor.Steerper_Motor_FWD(); break; case Steerper_Motor_REV_Val: Steerper_Motor.Steerper_Motor_REV(); break; default : System.Assert_Failed(); break; } } }
CallBack.c
#include "MyApplication.h" __IO uint16_t OC_Pulse_num_Channel1 = 200; /* 通道1的比较值 */ //比较值为200时,整个脉冲周期的计数值应为400。 ///168/400 = 10000/4 = 2500 Hz (分频系数为168,比较值为200) ///168/200 = 10000/2 = 5000 Hz (分频系数为168,比较值为100) ///6/400 = / 4 =70000 Hz(分频系数为6,比较值为200) / * @brief 定时器比较中断 * @param htim:定时器句柄指针 * @note 无 * @retval 无 */ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim) {
__IO uint16_t count; /*获取当前计数*/ count = __HAL_TIM_GET_COUNTER(htim); /*判断触发中断的输出通道并设置新的比较数值*/ if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
__HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, count + OC_Pulse_num_Channel1); } } / * @brief EXTI line detection callbacks. * @param GPIO_Pin Specifies the pins connected EXTI line * @retval None */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
HAL_Delay(100); //消抖 switch(GPIO_Pin) {
case KEY_EXTI_KEY0_Pin: KEY_EXTI_KEY0.KEY_Flag = TRUE; break; case KEY_EXTI_KEY1_Pin: KEY_EXTI_KEY1.KEY_Flag = TRUE; break; default:printf("Error\r\n"); break; } } / End Of File /
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121404.html