msp432p401r 编码器电机程序

本文介绍了如何使用Msp432p401r单片机通过外部中断和四倍频技术采集编码器电机的脉冲,以实现测速功能。讲解了编码器电机的连线方法、四倍频技术的优缺点,以及M法测速的计算公式。并提供了四倍频上位机的数据,帮助理解电机转速的计算过程。
摘要由CSDN通过智能技术生成

        编码器电机的原理网上有很多,如果不懂可以看下这个博主的文章STM32应用(九)编码器及其测速原理、L298N电机驱动控制编码器电机_長空雁的博客-CSDN博客

        在这里博主只讨论如何去用软件采集测速。

外部中断采集脉冲

编码器的AB相会输出方波,因为432p系列没有编码器模式,所以我们采用外部中断去获取脉冲值,下面贴上程序(采用了四倍频技术)

 四倍频技术

  • 20
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
对于MSP432P401R微控制器获取两轮编码器电机速度的标准库程序,你可以使用MSPWare软件包提供的驱动程序来实现。以下是一个基本的示例代码,用于获取两个编码器的速度: ```C #include <msp432p401r.h> #include <stdint.h> #include "driverlib.h" #define ENCODER_LEFT_BASE GPIO_PORT_P1 #define ENCODER_LEFT_PIN_A GPIO_PIN2 #define ENCODER_LEFT_PIN_B GPIO_PIN3 #define ENCODER_RIGHT_BASE GPIO_PORT_P1 #define ENCODER_RIGHT_PIN_A GPIO_PIN4 #define ENCODER_RIGHT_PIN_B GPIO_PIN5 volatile int32_t leftEncoderCount = 0; volatile int32_t rightEncoderCount = 0; void main(void) { // 初始化MSP432P401R WDT_A_hold(WDT_A_BASE); MAP_Interrupt_disableMaster(); MAP_Interrupt_enableSleepOnIsrExit(); // 配置左编码器引脚为输入 MAP_GPIO_setAsInputPinWithPullUpResistor(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_A | ENCODER_LEFT_PIN_B); // 配置右编码器引脚为输入 MAP_GPIO_setAsInputPinWithPullUpResistor(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_A | ENCODER_RIGHT_PIN_B); // 配置编码器引脚断 MAP_GPIO_interruptEdgeSelect(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_A | ENCODER_LEFT_PIN_B, GPIO_HIGH_TO_LOW_TRANSITION); MAP_GPIO_interruptEdgeSelect(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_A | ENCODER_RIGHT_PIN_B, GPIO_HIGH_TO_LOW_TRANSITION); // 注册编码器引脚断处理函数 MAP_GPIO_clearInterruptFlag(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_A | ENCODER_LEFT_PIN_B); MAP_GPIO_clearInterruptFlag(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_A | ENCODER_RIGHT_PIN_B); MAP_Interrupt_enableInterrupt(INT_PORT1); // 启用全局断 MAP_Interrupt_enableMaster(); while (1) { // 获取左编码器速度 int32_t leftSpeed = leftEncoderCount; leftEncoderCount = 0; // 获取右编码器速度 int32_t rightSpeed = rightEncoderCount; rightEncoderCount = 0; // 在这里处理编码器速度数据 // 延时一段时间 __delay_cycles(1000000); } } void PORT1_IRQHandler(void) { uint32_t status = MAP_GPIO_getEnabledInterruptStatus(ENCODER_LEFT_BASE); if (status & ENCODER_LEFT_PIN_A) { if (MAP_GPIO_getInputPinValue(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_B)) { leftEncoderCount++; } else { leftEncoderCount--; } MAP_GPIO_clearInterruptFlag(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_A); } if (status & ENCODER_LEFT_PIN_B) { if (MAP_GPIO_getInputPinValue(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_A)) { leftEncoderCount--; } else { leftEncoderCount++; } MAP_GPIO_clearInterruptFlag(ENCODER_LEFT_BASE, ENCODER_LEFT_PIN_B); } status = MAP_GPIO_getEnabledInterruptStatus(ENCODER_RIGHT_BASE); if (status & ENCODER_RIGHT_PIN_A) { if (MAP_GPIO_getInputPinValue(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_B)) { rightEncoderCount++; } else { rightEncoderCount--; } MAP_GPIO_clearInterruptFlag(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_A); } if (status & ENCODER_RIGHT_PIN_B) { if (MAP_GPIO_getInputPinValue(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_A)) { rightEncoderCount--; } else { rightEncoderCount++; } MAP_GPIO_clearInterruptFlag(ENCODER_RIGHT_BASE, ENCODER_RIGHT_PIN_B); } } ``` 这个示例代码使用MSP432P401R的GPIO库函数来配置编码器引脚,并使用断处理函数来计算编码器的速度。你可以根据你的具体需要进行修改和扩展。确保在使用之前,你已经正确配置了MSP432P401R的开发环境和驱动程序
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值