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

一、代码结构概览

// 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参数整定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25年软考架构师真题(回忆更新中)

论文题: 系统负载均衡设计方法事件驱动架构多模型数据库应用软件测试架构案例分析: 必选题:1.1填写质量属性的质量属性名 1.2解释器风格架构的组成图填空,以及解释为什么该模型适用解释器风格 选做题1redis2.1全量复制的流程图 <

优化用户体验:拦截浏览器前进后退、刷新、关闭、路由跳转等用户行为并弹窗提示

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 需求 首先列举一下需要拦截的行为&#xff0c;接下来我们逐个实现。 浏览器前进后退标签页刷新和关闭路由跳转 1、拦截浏览器前进后退 这里的实现是核心&#xff0c;涉及到大…

Docker:容器化技术

引言 传统部署环境逐渐不适应现在的企业开发&#xff0c;为了追求更加轻量&#xff0c;更加容易管理项目&#xff0c;引入了docker容器化技术去实现更加高效的部署环境。 一.docker风光下的内核功能和常用命令 1.docker容器和虚拟机的区别 我们在底层和应用层之间引入了一层do…

ping命令常用参数以及traceout命令

在网络故障排查和性能分析中&#xff0c;ping和 traceroute&#xff08;Windows中通常称为 tracert&#xff09;是两个极为重要的工具。它们帮助诊断网络连接问题&#xff0c;了解数据在网络中的传输路径。下面将详细介绍这两个命令的常用参数及其应用。 ping命令 ping命令用…

SpringBoot开发——Spring Boot异常处理全攻略:五大方案实战对比

文章目录 一、血泪教训:异常处理的代价二、五大异常处理方案详解2.1 全局异常处理(推荐方案)2.2 控制器级处理2.3 HTTP状态码注解2.4 ResponseEntity精细控制2.5 自定义异常体系(企业级方案)三、五大方案对比决策表四、四大避坑指南4.1 异常吞噬陷阱4.2 循环依赖问题4.3 异…

CodeBuddy 实现图片转素描手绘工具

本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前言 最近在社交媒体上&#xff0c;各种素描风格的图片火得一塌糊涂&#xff0c;身边不少朋友都在分享自己的 “素描照”&#xff0c;看着那些黑白线条勾勒出的独特韵味&a…

2025.05.21华为暑期实习机考真题解析第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 灾区物资调度路径规划 问题描述 在一次严重的自然灾害后,LYA负责协调救援物资的配送工作。救援区域包含多个受灾乡镇和一个物资集结点,各个地点之间的道路状况各异,有些甚至…

Gartner《Optimize GenAI Strategy for 4 Key ConsumerMindsets》学习心得

一、引言 在当今数字化营销浪潮中,生成式人工智能(GenAI)正以前所未有的速度重塑着市场格局。GenAI 既是一场充满机遇的变革,也是一场潜在风险的挑战。一方面,绝大多数 B2C 营销领导者对 GenAI 赋能营销抱有极高期待,他们看到了 GenAI 在提升时间与成本效率方面的巨大潜…

探索链表的奇妙世界:从基础到高级应用

链表是计算机科学中一种基础且重要的数据结构&#xff0c;它如同一条由珠子串成的项链&#xff0c;每个珠子&#xff08;节点&#xff09;都包含着数据和指向下一个珠子的线索。 与数组相比&#xff0c;链表在插入和删除操作上更加灵活&#xff0c;无需预先分配固定大小的内存…

黑马点评双拦截器和Threadlocal实现原理

文章目录 双拦截器ThreadLocal实现原理 双拦截器 实现登录状态刷新的原因&#xff1a; ​ 防止用户会话过期&#xff1a;通过动态刷新Token有效期&#xff0c;确保活跃用户不会因固定过期时间而被强制登出 ​ 提升用户体验&#xff1a;用户无需频繁重新登录&#xff0c;只要…

Windows 中动态库.dll 的 .lib 文件有什么作用?

在 Windows 平台开发中, 动态链接库(Dynamic Link Library, DLL)。与之相关的还有一个常让人困惑的文件——.lib 文件。那么,这个 .lib 文件到底有什么作用呢? 一、什么是 .lib 文件? .lib 文件是 静态导入库(Import Library) 文件,它通常与动态链接库(DLL)一起生成…

细说STM32单片机FreeRTOS消息缓冲区及其应用实例

目录 一、消息缓冲区功能概述 二、消息缓冲区操作相关函数 1、相关函数概述 2、部分函数详解 &#xff08;1&#xff09;创建消息缓冲区 &#xff08;2&#xff09;写入消息 &#xff08;3&#xff09;读取消息 &#xff08;4&#xff09;消息缓冲区状态查询 三、消息…

【缓存】JAVA本地缓存推荐Caffeine和Guava

&#x1f31f; 引言 在软件开发过程中&#xff0c;缓存是提升系统性能的常用手段。对于基础场景&#xff0c;直接使用 Java集合框架&#xff08;如Map/Set/List&#xff09;即可满足需求。然而&#xff0c;当面对更复杂的缓存场景时&#xff1a; 需要支持多种过期策略&#x…

IDA插件 MIPSROP的安装和使用方法

前言 笔者的IDA版本为9.0&#xff0c;刚开始根据一些博客描述以为将mipsrop.py拷贝到IDA的plugins目录即可&#xff0c;可操作后发现事情好像没这么简单&#xff0c;复制进去后就发现没有博客中所说的 MIPS ROP Finder &#xff0c;笔者在网上搜索了很多博客后在 https://bbs.…

(1)转置后,行列式的值不变 (2)将行列式的任意两行互换位置后,行列式改变符号

以下是对原始内容在不改变内容本身的前提下进行的格式优化&#xff0c;以提升可读性和逻辑清晰度&#xff1a; ✅ 行列式的几何意义 行列式&#xff08;determinant&#xff09;是线性代数中一个非常重要的概念&#xff0c;它的几何含义可以从以下几个方面理解&#xff1a; &a…

最大似然估计(Maximum Likelihood Estimation, MLE)详解

一、定义 最大似然估计 是一种参数估计方法&#xff0c;其核心思想是&#xff1a; 选择能使观测数据出现概率最大的参数值作为估计值。 具体来说&#xff0c;假设数据 D x 1 , x 2 , … , x n D{x_1,x_2,…,x_n} Dx1​,x2​,…,xn​独立且服从某个概率分布 P ( x ∣ θ ) P(…

用go从零构建写一个RPC(3)--异步调用+多路复用实现

在前两个版本中&#xff0c;我们实现了基础的客户端-服务端通信、连接池、序列化等关键模块。为了进一步提升吞吐量和并发性能&#xff0c;本版本新增了 异步发送机制 和 多路复用支持&#xff0c;旨在减少资源消耗、提升连接利用率。 代码地址&#xff1a;https://github.com/…

FFmpeg 安装包全攻略:gpl、lgpl、shared、master 区别详解

这些 FFmpeg 安装包有很多版本和变种&#xff0c;主要区别在于以下几个方面&#xff1a; ✅ 一、从名称中看出的关键参数&#xff1a; 1. 版本号 master&#xff1a;开发版&#xff0c;最新功能&#xff0c;但可能不稳定。n6.1 / n7.1&#xff1a;正式版本&#xff0c;更稳定…

深度学习实战:从图像分类到文本生成的完整案例解析

1 图像分类案例 1.1 CIFAR10数据集介绍 cifar数据是torchvision第三方包提供的数据集 训练集5w 测试集1w y标签 10个类别 10分类问题 一张图形状 (32, 32, 3) import torch import torch.nn as nn from torchvision.datasets import CIFAR10 from torchvision.transforms i…

Android 添加系统服务的完整流程

[应用程序] (应用进程)│↓ 调用简单API [SoundManager] │ ├─ 代理模式门面模式&#xff08;应用进程&#xff09;│ ├─ 缓存数据 ←─ 装饰器模式&#xff08;应用进程&#xff09;│ └─ 转换异常 ←─ 适配器模式&#xff08;应用进程&#xff09;│↓ 通过Bind…