本帖最后由 子曰好人 于 2018-9-3 23:06 编辑
转矩模式任务
电机库给我们提供了转矩控制的接口函数voidMC_ProgramTorqueRampMotor1( int16_t hFinalTorque, uint16_t hDurationms )。函数第一个参数是目标转矩,第二个参数是持续时间,也就是经过多少时间达到目标转矩。 转矩模式我就自定义为任务5了,代码如下: - int16_t Torque_adc = 0;
- int16_t Torque_ref = 0;
- void task_5(void)
- {
- Torque_adc = R3_1_F30X_ExecRegularConv(MC_SPEED_REF,ADC_CHANNEL_12);
- Torque_ref = (5000*Torque_adc)>>16;
- if(Torque_ref > 0)
- {
- MC_ProgramTorqueRampMotor1(Torque_ref+900, 1000);
- MC_StartMotor1();
- }
- else
- {
- MC_StopMotor1();
- }
- HAL_Delay(100);
- }
复制代码主函数代码: - /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- if(GPIO_PIN_SET == HAL_GPIO_ReadPin(LED11_GPIO_Port,LED11_Pin))
- {
- task_5();
- }
- else
- {
- MC_ProgramTorqueRampMotor1(0, 0);
- MC_StopMotor1();
- }
- realspeed = MC_GetMecSpeedAverageMotor1()*6;
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
复制代码其中5000是通过任务4测试出来的,900是通过任务5测试出来的,维持最低转速需要转矩参考量给到900。
实验现象:
这个任务虽然完成了但是留下了一些疑问,还需要一段时间去深入了解代码所做的事情。
一些疑问和吐槽: 1.在做这个任务的时候,想吐槽一下电机库这个结构体,传指针是对于阅读代码来说不是很友好,另外就是有些结构体写得不够明白,比如存储dq轴电流、电压的这个结构体
- typedef struct
- {
- int16_t qV_Component1;
- int16_t qV_Component2;
- } Volt_Components;
复制代码从结构体自身来看,结构体由组件1和组件2构成,但是这个在使用中并不能很好的明白组件1和组件2代表的意思,我看到电机库代码中结构体命名都是Vqd、Iqd这种形式,但是按照大家的习惯可能会把字母符号排在靠前的放前面,如Vdq、Idq这种。也许是我涉足代码不够深入,不了解ST工程师的想法,这里仅提出一点我自己的看法。
2.接口函数注释描述不是很清晰,比如这个转矩模式的接口函数,我不能知道转矩设定值的限制大小或者通过某种算法来获取转矩参考值。好在我仿真任务4的时候可以查看q轴电流设定值的大小。
3.转矩模式启动的时候速度会有一个过冲过程,通过仿真调试可以看到在启动的时候iq给定值非常大,过一会儿又降下来了,可能是满转矩启动造成的,后面要好好研究一下启动部分的代码了。
4.我遇到的关于编译器的问题,不知道是否是因为工程过于庞大,我用MDK5.25进行仿真的时候出现了编译器类似死机的现象,电机套件正常运行,watch窗口里的变量没有变化。我新建了IAR的工程,仿真的时候不会出现这个问题,不知道各位有遇到过没
ok,今天的分享就到这里,欢迎大家留言讨论。
|