MSP430通用电机控制代码(Motor)设计与实现

发布于:2025-05-25 ⋅ 阅读:(18) ⋅ 点赞:(0)

一、代码结构概览

// Motor.h

// Motor.h
#ifndef __MOTOR_H_
#define __MOTOR_H_

#include "A_include.h"

void Motor_Init(void);   // 初始化函数
void PWM_SET(int duty0, int duty1); // PWM设置函数

#endif

// Motor.c

// Motor.c
#include "Motor.h"

void Motor_Init(void) {
    DL_Timer_startCounter(Motor_INST); // 启动定时器PWM输出
}

void PWM_SET(int duty0, int duty1) {
    // 占空比限制(-2700 ~ +2700)
    duty0 = (duty0 > 2700) ? 2700 : ((duty0 < -2700) ? -2700 : duty0);
    duty1 = (duty1 > 2700) ? 2700 : ((duty1 < -2700) ? -2700 : duty1);

    // 方向控制与PWM配置
    if (duty0 >= 0) {
        DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_26);    // 正转逻辑(AIN1)
        DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_27);  // 反转逻辑(AIN2)
        DL_Timer_setCaptureCompareValue(Motor_INST, duty0, DL_TIMER_CC_0_INDEX);
    } else {
        DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_27);
        DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_26);
        DL_Timer_setCaptureCompareValue(Motor_INST, -duty0, DL_TIMER_CC_0_INDEX);
    }

    if (duty1 >= 0) {
        DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_4);     // 正转逻辑(BIN1)
        DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_5);   // 反转逻辑(BIN2)
        DL_Timer_setCaptureCompareValue(Motor_INST, duty1, DL_TIMER_CC_1_INDEX);
    } else {
        DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_5);
        DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_4);
        DL_Timer_setCaptureCompareValue(Motor_INST, -duty1, DL_TIMER_CC_1_INDEX);
    }
}

二、核心设计亮点

1. 双电机独立控制

  • 通道配置:通过定时器CC0和CC1分别控制两个电机(AIN/BIN通道)
  • 方向逻辑:利用GPIO电平组合实现正反转控制:
    if (duty >= 0) {
        setPin_high(AIN1); clearPin(AIN2);
    } else {
        setPin_high(AIN2); clearPin(AIN1);
    }
    

2. 动态占空比限制

duty = (duty > 2700) ? 2700 : ((duty < -2700) ? -2700 : duty);
  • 防止PWM值超出硬件最大范围(假设PWM周期为3000)
  • 支持负数输入(反向旋转)

3. 硬件抽象层封装

  • GPIO操作:使用DL_GPIO_setPins/DL_GPIO_clearPins实现引脚控制
  • PWM配置:通过DL_Timer_setCaptureCompareValue直接设置占空比

三、MSP430适配要点

1. 定时器配置

在这里插入图片描述

在这里插入图片描述

2. GPIO

在这里插入图片描述


四、典型应用场景

1. 差速转向控制

// 左转示例
PWM_SET(500, 1500); // 左电机低速,右电机高速

2. 闭环PID控制

int target_speed = 1000;
int error = target_speed - actual_speed;
int duty = PID调节(error);
PWM_SET(duty, duty);

五、性能优化建议

  1. 多电机扩展
    void PWM_SET(int duty0, int duty1, int duty2, int duty3) {
        // 支持4个电机控制
    }
    

六、调试技巧

  1. LED状态指示

    // 电机状态指示灯
    void debug_led(int duty) {
        if (duty > 0) P2OUT |= BIT0; // 正转
        else P2OUT &= ~BIT0;        // 反转
    }
    
  2. 参数校准方法

    • 逐步调整占空比,记录电机转速
    • 绘制占空比-转速曲线用于PID参数整定


网站公告

今日签到

点亮在社区的每一天
去签到