H桥简单24V直流电机GPIO驱动代码

主控: 雅特力AT32F403A, 主频100Mhz

驱动: GPIO口简单驱动

先展示主要的桥电路

头文件

c 复制代码
/***************************************************************************
  *             Copyright notice & Disclaimer
  *     
  **************************************************************************
  * @file       文件名: motor.h
  * @date       日 期:  2023-11-23  
  * @version    版本号: v1.0 
  * @auther     作 者: 吴川流 
  **************************************************************************
  * @brief 简 述:                       
  *     电机控制文件
  *************************************************************************/

#ifndef _MOTOR_H__
#define _MOTOR_H__

#include "../main.h"

#define PWM_N_LBW       PDOut(8)
#define PWM_E_LBW       PBOut(15)
typedef enum
{
    MOTOR_STOP,
    MOTOR_ZZ,  //正转
    MOTOR_FZ,  //反转
} motor_state;

typedef struct {
    __IO motor_state nState; //需要进入的状态
    motor_state cState;     //当前的状态
    __IO uint8_t motorWorkFg : 1; //电机工作状态
    uint8_t mStateSW : 1;       //电机状态切换
    uint8_t mStopping : 1;      //电机停止状态中
} motor_type;
//电机速度匹配的PWM百分比
extern __IO uint8_t PwmDutyPre;
extern motor_type motorType;

/*
 * 走丝电机使能并设置转动方向
 * */
static inline void MotorEnaAndSetDir(motor_state mstate)
{
    motorType.motorWorkFg = 1;
    motorType.nState = mstate;
}

/*
 * 电机停止
 * */
static inline void MotorDis(void)
{
    motorType.motorWorkFg = 0;
    motorType.nState = MOTOR_STOP;
}

/*
 * 送丝正转
 * 参数传入正转占空比百分比
 * */
#define MOTOR_ZZ_RUN_()  do { \
                                __NOP();    \
                                __NOP();    \
                                pwmn_duty_set_(0);  \
                                sys_nopLoop(16);    \
                                __NOP();      \
                                __NOP();    \
                                PWM_E_LBW = 0;  \
                                sys_nopLoop(25); \
                                pwme_duty_set_(PwmDutyPre); \
                                __NOP();    \
                                __NOP();    \
                                PWM_N_LBW = 1;  \
                                __NOP();    \
                                __NOP();    \
                            }while(0)

/*
 * 退丝反转
 * 参数传入正转占空比百分比
 * */
#define MOTOR_FZ_RUN_()    do { \
                                __NOP();      \
                                __NOP();        \
                                pwme_duty_set_(0);      \
                                sys_nopLoop(16);\
                                __NOP();      \
                                __NOP();    \
                                PWM_N_LBW = 0;      \
                                sys_nopLoop(25);    \
                                pwmn_duty_set_(PwmDutyPre);     \
                                __NOP();        \
                                __NOP();        \
                                PWM_E_LBW = 1;      \
                                __NOP();        \
                                __NOP();       \
                            } while(0)

/*
 * 电机刹车
 * */
#define MOTOR_BRAKE_()   do \
                        {  \
                            __NOP();     \
                            __NOP();     \
                            pwmn_duty_set_(0);    \
                            sys_nopLoop(10); \
                            pwme_duty_set_(0);  \
                            sys_nopLoop(10); \
                            PWM_N_LBW = 1;  \
                            __NOP();     \
                            __NOP();     \
                            PWM_E_LBW = 1;        \
                            __NOP();     \
                            __NOP();     \
                        } while(0)

/*
 * 电机停止
 * */
#define MOTOR_STOP_()      do \
                        {    \
                            __NOP();     \
                            __NOP();     \
                            pwmn_duty_set_(0); \
                            sys_nopLoop(10); \
                            pwme_duty_set_(0); \
                            sys_nopLoop(10); \
                            PWM_E_LBW = 0;     \
                            __NOP();     \
                            __NOP();     \
                            PWM_N_LBW = 0; \
                            __NOP();     \
                            __NOP();     \
                        } while(0)



#endif //_MOTOR_H__

C代码

c 复制代码
#include "motor.h"

__IO uint8_t PwmDutyPre;
motor_type motorType = {
            .cState = MOTOR_STOP,
            .nState = MOTOR_STOP,
            .motorWorkFg = 0,
            .mStateSW = 0,
            .mStopping = 0
        };
/*
 * 电机驱动控制函数
 * */
void motorController(void)
{
    static uint8_t gapTime = 0;
    static uint8_t stopStep = 0;
    if (motorType.motorWorkFg && (!motorType.mStopping))
    {
        if ((motorType.nState == MOTOR_ZZ) && (!motorType.mStateSW))
        {
            //电机正转
            stopStep = 0;
            if (motorType.cState == MOTOR_STOP)
            {
                MOTOR_ZZ_RUN_();
                motorType.cState = MOTOR_ZZ;
            }
            else if (motorType.cState == MOTOR_FZ)
            {
                motorType.mStateSW = 1;
                goto motor_dis_gt;
            }
        }
        else if ((motorType.nState == MOTOR_FZ) && (!motorType.mStateSW))
        {
            //电机反转
            stopStep = 0;
            if (motorType.cState == MOTOR_STOP)
            {
                MOTOR_FZ_RUN_();
                motorType.cState = MOTOR_FZ;
            }
            else if (motorType.cState == MOTOR_ZZ)
            {
                motorType.mStateSW = 1;
                goto motor_dis_gt;
            }
        }
        else
            goto motor_dis_gt;
    }
    else
    {
        motor_dis_gt:
        if (stopStep == 0)
        {
            motorType.mStopping = 1;
            gapTime = 0;
            MOTOR_BRAKE_();
            stopStep = 1;
        }
        else if (stopStep == 1)
        {
            if (gapTime >= 20)
            {
                MOTOR_STOP_();
                stopStep = 2;
            }
            else
                gapTime++;
        }
        else if (stopStep == 2)
        {
            gapTime = 0;
            motorType.cState = MOTOR_STOP;
            motorType.mStopping = 0;
            if (!motorType.mStateSW)
                motorType.nState = MOTOR_STOP;
            else
                motorType.mStateSW = 0;
            stopStep = 3;
        }
    }
}
相关推荐
深圳市九鼎创展科技2 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计2 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报4 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业4 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能4 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn4 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响4 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592755 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82185 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯5 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试