一、开发计划
基础任务:
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延时 */
}
串口获取键盘输入
将输入的[0,9]转化为0-90的pwm控制电机
核心代码:
int getChar;
while (1)
{
getChar = (GETCHAR()-48)*10;
PRINTF("ADC valueP: %d\r\n", getChar);
set_motor(getChar);
}
我要赚赏金
