这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 基于FRDM-MCXA153的电机控制-过程贴

共1条 1/1 1 跳转至

基于FRDM-MCXA153的电机控制-过程贴

菜鸟
2026-01-17 22:05:37     打赏

准备好硬件和开发环境后,就可以开始实现任务了~

一、开发计划

基础任务:

1.电机启停与方向控制:通过程序实现电机的启动、停止、正转和反转。 2.电机调速控制:编写一个函数,可以通过输入参数(如0-100)来改变PWM的占空比,从而控制速度。

进阶任务:

1.基于电位器的模拟调速系统:使用一个旋转电位器作为输入,实时无级地控制电机的速度和方向。 2.实现一个通过串口发送高级指令来控制电机的系统:创建一个简单的指令集,让上位机(如串口助手)可以通过发送特定格式的字符串命令,来执行电机的动作。

任务拆解:

任务功能技术点

电机启停与方向控制GPIO+PWM
电机调速控制PWM
基于电位器的模拟调速系统ADC+PWM
指令控制UART+PWM

所以基本按着任务的顺序逐步实现就很舒服了。技术点基本照着例程来实现。

二、开发过程1、基础任务开发

我是在frdmmcxa153_pwm例程的基础上修改的。

实现以下功能:

  • pwm波输出

  • GPIO控制电机正反转

  • 电机驱动:输入[-100,100],输出对应占空比以及正转反转的GPIO控制

  • 测试例

引脚连接:

FRDM-MCXA153 开发板硬件连接说明:

  • FLEXPWM0 模块 0 通道 A → 用于输出PWM信号  

  • GPIO1.4 → 电机方向控制信号1  

  • GPIO1.5 → 电机方向控制信号2

  • LPUART0 → 连接到PC的虚拟串口  


核心代码如下:

 void set_motor(int pwmVal)
 {
     if(pwmVal < 0) {
         pwmVal = -pwmVal;
         GPIO_PinWrite(GPIO1, 4, 1);
         GPIO_PinWrite(GPIO1, 5, 0);
         PRINTF("set_motor:-%d\r\n",pwmVal);
     }
     else{
         GPIO_PinWrite(GPIO1, 4, 0);
         GPIO_PinWrite(GPIO1, 5, 1);
         PRINTF("set_motor:%d\r\n",pwmVal);
     }
     if(pwmVal > 100) pwmVal = 100;
     if(pwmVal < 10) pwmVal = 0;
 
     PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal);
     PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
 }

测试代码:

     while (1U)
     {
         /* Delay at least 100 PWM periods. */
         SDK_DelayAtLeastUs((1000000U / APP_DEFAULT_PWM_FREQUENCY) * 100, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
 
         static int direction = 1; // 用于控制方向的静态变量
 
         pwmVal = pwmVal + 4 * direction;
 
         /* 改变方向 */
         if (pwmVal >= 100)
         {
             pwmVal = 100;
             direction = -1; // 向下减小
         }
         else if (pwmVal <= -100)
         {
             pwmVal = -100;
             direction = 1; // 向上增加
         }
 
         set_motor(pwmVal);
 
     }

2、进阶任务开发——电位器控制电机

实现一下功能:

  • 使用ADC检测电位器上的电压

  • 将adc的值转化为[-100,100],传给电机控制

引脚连接:

使用P2_0用于测量电位器的电压。

核心代码:

     while (1)
     {
         GETCHAR();
         LPADC_DoSoftwareTrigger(DEMO_LPADC_BASE, 1U); /* 1U is trigger0 mask. */
         while (!LPADC_GetConvResult(DEMO_LPADC_BASE, &mLpadcResultConfigStruct))
         {
         }
         PRINTF("ADC valueP: %d\r\n", ((mLpadcResultConfigStruct.convValue) >> g_LpadcResultShift));
         set_motor(map_adc_to_pwm(mLpadcResultConfigStruct.convValue));
         SDK_DelayAtLeastUs(500000U, CLOCK_GetFreq(kCLOCK_CoreSysClk)); /* 添加500ms延时 */
     }


3、进阶任务开发——指令控制电机

  • 串口获取键盘输入

  • 将输入的[0,9]转化为0-90的pwm控制电机

核心代码:

     int getChar;
     while (1)
     {
         getChar = (GETCHAR()-48)*10;
 
         PRINTF("ADC valueP: %d\r\n", getChar);
         set_motor(getChar);
     }





共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]