您好!
我正在尝试使用评估套件 TM4C1294XL 来实现电机调节应用。 使用 PWM 和 QEI 的组合似乎存在问题。 另外、这两个模块工作正常。 因此、我能够生成具有给定占空比的 PWM 信号。 此外、还可以使用 QEI 读取和计算速度和 RPM。
我计算电流 rpm 并拟合 PI 调节算法。 该算法会返回新的占空比。 一旦我将新计算出的 dutycycle 放入 ROM_PWMPulseWidthSet 函数、PWM 信号的周期时间似乎就会更改为 使用函数 ROM_QEIVelocityConfigure 配置的 QEI 模块的选定测量时间
您是否对我如何解决该问题有任何疑问? 。 QEI 似乎会阻止 PWM 模块。 这是原因吗?
在这里是初始化代码块和主例程:
//启用 QEI 外设 ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOL);//PL1;PL2 ROM_SysCtlPeripheralEnable (SYSCTL_Periph_QEI0); //将引脚设置为 PHA0和 PH0 ROM_GPIOPinConfigure (GPIO_PL1_PHA0); ROM_GPIOPinConfigure (GPIO_PL2_PHB0); //设置 QEI 的 GPIO 引脚。 ROM_GPIOPinTypeQEI (GPIO_PORTL_BASE、GPIO_PIN_1 | GPIO_PIN_2); //在配置前禁用外设和 int ROM_QEIDisable (QEI0_BASE); ROM_QEIIntDisable (QEI0_BASE、QEI_INTERROR | QEI_INTDIR | QEI_INTTIMER | QEI_INTINDEX); //配置正交编码器,使用任意上限2000 ROM_QEIConfigure (QEI0_BASE、(QEI_CONFIG_CAPTURE_A_B | QEI_CONFIG_NO_RESET | QEI_CONFIG_QUIPON_SWAP)、479);//QEI_CONFIG_CLOCK_DIR //启用正交编码器。 ROM_QEIEnable (QEI0_BASE); //将位置设置为中间值,以便我们可以查看是否正常工作 ROM_QEIPositionSet (QEI0_BASE、0); ROM_QEIVelocityConfigure (QEI0_BASE、QEI_VELDIV_1、120000000);//1000ms 测量时间 ROM_QEIVelocityEnable (QEI0_BASE);
//启用必要的外设 ROM_SysCtlPeripheralEnable (L298N_PWM_CONFIG0); ROM_SysCtlPeripheralEnable (L298N_PWM_CONFIG1); ROM_SysCtlPeripheralEnable (L298N_GPIO_CONFIG0); ROM_SysCtlPeripheralEnable (L298N_GPIO_CONFIG1); //设置方向引脚的数字输出信号 ROM_GPIOPinTypeGPIOOutput (L298N_IN1);// IN1 ROM_GPIOPinTypeGPIOOutput (L298N_IN2);// IN2 //设置 PWM 时钟 ROM_PWMClockSet (PWM0_BASE、PWM_SYSCLK_DIV_8);// 15MHz PWM_CLOCK =(SYSTEM_CLOCK / 8); ROM_GPIOPinConfigure (L298N_ENA_TYPE); ROM_GPIOPinTypePWM (L298N_ENA); //设置 PWM 模式 ROM_PWMGenConfigure (PWM0_BASE、PWM_GEN_0、PWM_GEN_MODE_DOWN | PWM_GEN_MODE_NO_SYNC); //设置 PWM 周期时间 //Period_Time_ticks =((SYSTEM_CLOCK / 64)/PWM_FREQUENCY)-1; PERIOD_TIME_TICKs =(PWM_CLOCK / PWM_FREQUENCY); ROM_PWMGenPeriodSet (PWM0_BASE、PWM_GEN_0、PERIOD_TIME_TICK); //启用 PWM 输出 ROM_PWMOutputState (PWM0_BASE、PWM_OUT_1_BIT、TRUE); //启动 PWM 发生器(定时器) ROM_PWMGenEnable (PWM0_BASE、PWM_GEN_0);
while (1){ regulation.setParameters(Kp、Ki、Kd); //运行电机 motordriver.run(FORWARD、Duty); //测量 RPM rpm_sensor.calculateRPM(); rpm_x = rpm_sensor.getRPM (); //更新电机调节算法 占空比=调节.pi_regulation (rpm_w、rpm_x); ROM_SysCtlDelay (g_ui32SysClock/3 /100);// 10ms 如果(a==1){ GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0); A=2; } 否则、如果(a=2){ GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、1); A=1; } }
非常感谢!
此致