#申请原创# #申请开发板# 有幸能有这次测评的机会,LKS32MC037是主频48mHZ,集成了3P3N的mos预驱,预驱电压在7.8V-28v,节省了像ir2101s或者fd6288之类预驱芯片,对于成本上是有极大的优势的,这是是一个专门用于驱动电机而开发的mcu,我们本次测评当然是哦用来测试电机, 如图:基本的接线:
没有合适的端子,直接焊接,省事:
我们主要是要对adc以及PWM进行配置:如下 void ADC_init(void) { ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.Align = ADC_LEFT_ALIGN; /* ADC数据左对齐模式 */ #if (CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_1SHUNT) ADC_InitStructure.FirSeg_Ch = 2; /* 第一段共采样2个通道 */ ADC_InitStructure.SecSeg_Ch = 6; /* 第二段共采样6个通道 */ ADC_InitStructure.SEL_En = ADC_MCPWM_TRG ; /* 打开MCPWM硬件触发事件 */ ADC_InitStructure.Trigger_En = ADC_HARDWARE_T0_TRG | ADC_HARDWARE_T1_TRG;; /* 打开MCPWM_T0 MCPWM_T1硬件触发事件 */ ADC_InitStructure.Trigger_Mode = ADC_2SEG_TRG; /* 设置ADC转换模式为双段式采样 */ ADC_InitStructure.IE = 0; //ADC_EOS1_IRQ_EN; /* ADC第二段采样结束中断使能,此处单电阻不需要ADC中断*/ ADC_InitStructure.ADC_SAMP_CLK = 12; /* 12--20个时钟周期 */ #else #if (CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_2SHUNT) ADC_InitStructure.FirSeg_Ch = 8; /* 第一段共采样8个通道 */ ADC_InitStructure.SecSeg_Ch = 0; /* 第二段共采样0个通道 */ ADC_InitStructure.SEL_En = ADC_MCPWM_TRG ; /* 打开 MCPWM 硬件触发事件 */ ADC_InitStructure.Trigger_En = ADC_HARDWARE_T0_TRG; /* 使能 T0 硬件触发ADC采样 */ ADC_InitStructure.Trigger_Mode = ADC_1SEG_TRG; /* 设置ADC转换模式为单段式采样 */ ADC_InitStructure.IE = ADC_EOS0_IRQ_EN; /* ADC第一段采样结束中断使能 */ ADC_InitStructure.ADC_SAMP_CLK = 20; /* 12个时钟周期 */ #endif #endif ADC_Init(ADC, &ADC_InitStructure); ADC_IF = 0xff; ADC_STATE_RESET(); ADC_NormalModeCFG(); } void MCPWM_init(void) { MCPWM_InitTypeDef MCPWM_InitStructure; MCPWM_StructInit(&MCPWM_InitStructure); MCPWM_InitStructure.CLK_DIV = 0; /* MCPWM时钟分频设置 */ MCPWM_InitStructure.MCLK_EN = ENABLE; /* 模块时钟开启 */ MCPWM_InitStructure.MCPWM_Cnt0_EN = ENABLE; /* 时基0主计数器开始计数使能开关 */ MCPWM_InitStructure.MCPWM_Cnt1_EN = ENABLE; /* 时基1主计数器开始计数使能开关 */ MCPWM_InitStructure.MCPWM_WorkModeCH0 = CENTRAL_PWM_MODE; MCPWM_InitStructure.MCPWM_WorkModeCH1 = CENTRAL_PWM_MODE; /* 通道工作模式设置,中心对齐或边沿对齐 */ MCPWM_InitStructure.MCPWM_WorkModeCH2 = CENTRAL_PWM_MODE; /* 自动更新使能寄存器 MCPWM_TH00 自动加载使能 MCPWM_TMR0 自动加载使能 MCPWM_0TH 自动加载使能 MCPWM_0CNT 自动加载使能*/ MCPWM_InitStructure.AUEN = TH00_AUEN | TH01_AUEN | TH10_AUEN | TH11_AUEN | TH20_AUEN | TH21_AUEN | TMR0_AUEN | TMR1_AUEN | TMR2_AUEN | TMR3_AUEN | TH0_AUEN | TH30_AUEN | TH31_AUEN ; MCPWM_InitStructure.GPIO_BKIN_Filter = 12; /* 急停事件(来自IO口信号)数字滤波器时间设置 */ MCPWM_InitStructure.CMP_BKIN_Filter = 12; /* 急停事件(来自比较器信号)数字滤波器时间设置 */ MCPWM_InitStructure.TimeBase0_PERIOD = PWM_PERIOD; /* 时期0周期设置 */ MCPWM_InitStructure.TimeBase1_PERIOD = PWM_PERIOD; /* 时期1周期设置 */ MCPWM_InitStructure.TriggerPoint0 = (u16)(20 - PWM_PERIOD); //100 /* MCPWM_TMR0 ADC触发事件T0 设置 */ MCPWM_InitStructure.TriggerPoint1 = (u16)(800 - PWM_PERIOD); /* MCPWM_TMR1 ADC触发事件T1 设置 */ MCPWM_InitStructure.DeadTimeCH0123N = DEADTIME; /* 通道0,1,2,3的N端死区时间设置 */ MCPWM_InitStructure.DeadTimeCH0123P = DEADTIME; /* 通道0,1,2,3的P端死区时间设置 */ #if (PRE_DRIVER_POLARITY == P_HIGH__N_LOW) /* CHxP 高有效, CHxN低电平有效 */ MCPWM_InitStructure.CH0N_Polarity_INV = ENABLE; /* CH0N通道输出极性设置 | 正常输出或取反输出*/ MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE; /* CH0P通道输出极性设置 | 正常输出或取反输出 */ MCPWM_InitStructure.CH1N_Polarity_INV = ENABLE; MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE; MCPWM_InitStructure.CH2N_Polarity_INV = ENABLE; MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE; MCPWM_InitStructure.Switch_CH0N_CH0P = DISABLE; /* 通道交换选择设置 | CH0P和CH0N是否选择信号交换 */ MCPWM_InitStructure.Switch_CH1N_CH1P = DISABLE; /* 通道交换选择设置 */ MCPWM_InitStructure.Switch_CH2N_CH2P = DISABLE; /* 通道交换选择设置 */ /* 默认电平设置 默认电平输出不受MCPWM_IO01和MCPWM_IO23的 BIT0、BIT1、BIT8、BIT9、BIT6、BIT14 通道交换和极性控制的影响,直接控制通道输出 */ MCPWM_InitStructure.CH0P_default_output = LOW_LEVEL; MCPWM_InitStructure.CH0N_default_output = HIGH_LEVEL; MCPWM_InitStructure.CH1P_default_output = LOW_LEVEL; /* CH1P对应引脚在空闲状态输出低电平 */ MCPWM_InitStructure.CH1N_default_output = HIGH_LEVEL; /* CH1N对应引脚在空闲状态输出高电平 */ MCPWM_InitStructure.CH2P_default_output = LOW_LEVEL; MCPWM_InitStructure.CH2N_default_output = HIGH_LEVEL; #else #if (PRE_DRIVER_POLARITY == P_HIGH__N_HIGH) /* CHxP 高有效, CHxN高电平有效 */ MCPWM_InitStructure.CH0N_Polarity_INV = DISABLE; /* CH0N通道输出极性设置 | 正常输出或取反输出*/ MCPWM_InitStructure.CH0P_Polarity_INV = DISABLE; /* CH0P通道输出极性设置 | 正常输出或取反输出 */ MCPWM_InitStructure.CH1N_Polarity_INV = DISABLE; MCPWM_InitStructure.CH1P_Polarity_INV = DISABLE; MCPWM_InitStructure.CH2N_Polarity_INV = DISABLE; MCPWM_InitStructure.CH2P_Polarity_INV = DISABLE; MCPWM_InitStructure.Switch_CH0N_CH0P = DISABLE; /* 通道交换选择设置 | CH0P和CH0N是否选择信号交换 */ MCPWM_InitStructure.Switch_CH1N_CH1P = DISABLE; /* 通道交换选择设置 */ MCPWM_InitStructure.Switch_CH2N_CH2P = DISABLE; /* 通道交换选择设置 */ /* 默认电平设置 默认电平输出不受MCPWM_IO01和MCPWM_IO23的 BIT0、BIT1、BIT8、BIT9、BIT6、BIT14 通道交换和极性控制的影响,直接控制通道输出 */ MCPWM_InitStructure.CH0P_default_output = LOW_LEVEL; MCPWM_InitStructure.CH0N_default_output = LOW_LEVEL; MCPWM_InitStructure.CH1P_default_output = LOW_LEVEL; /* CH1P对应引脚在空闲状态输出低电平 */ MCPWM_InitStructure.CH1N_default_output = LOW_LEVEL; /* CH1N对应引脚在空闲状态输出高电平 */ MCPWM_InitStructure.CH2P_default_output = LOW_LEVEL; MCPWM_InitStructure.CH2N_default_output = LOW_LEVEL; #endif #endif MCPWM_InitStructure.DebugMode_PWM_out = ENABLE; /* 在接上仿真器debug程序时,暂停MCU运行时,选择各PWM通道正常输出调制信号 还是输出默认电平,保护功率器件 ENABLE:正常输出 DISABLE:输出默认电平*/ MCPWM_InitStructure.MCPWM_Base0T0_UpdateEN = ENABLE; /* MCPWM 时基0 T0事件更新使能 */ MCPWM_InitStructure.MCPWM_Base0T1_UpdateEN = DISABLE; /* MCPWM 时基0 T1事件更新 禁止*/ MCPWM_InitStructure.MCPWM_Base1T0_UpdateEN = ENABLE; /* MCPWM 时基1 T0事件更新使能 */ MCPWM_InitStructure.MCPWM_Base1T1_UpdateEN = DISABLE; /* MCPWM 时基1 T1事件更新 禁止*/ #if (CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_1SHUNT) MCPWM_InitStructure.CNT0_T1_Update_INT_EN = ENABLE; /* T0更新事件 中断使能或关闭 */ #else #if (CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_2SHUNT) MCPWM_InitStructure.CNT0_T0_Update_INT_EN = DISABLE; /* T0更新事件 中断使能或关闭 */ #else #if (CURRENT_SAMPLE_TYPE == CURRENT_SAMPLE_3SHUNT) MCPWM_InitStructure.CNT0_T0_Update_INT_EN = DISABLE; /* T0更新事件 中断使能或关闭 */ #endif #endif #endif MCPWM_InitStructure.FAIL0_INT_EN = ENABLE; /* FAIL0事件 中断使能或关闭 */ MCPWM_InitStructure.FAIL0_INPUT_EN = ENABLE; /* FAIL0通道急停功能打开或关闭 */ MCPWM_InitStructure.FAIL0_Signal_Sel = FAIL_SEL_CMP; /* FAIL0事件信号选择,比较器或IO口 */ MCPWM_InitStructure.FAIL0_Polarity = HIGH_LEVEL_VALID; /* FAIL0事件极性选择,高有效 */ MCPWM_InitStructure.FAIL1_INT_EN = DISABLE; /* FAIL1事件 中断使能或关闭 */ MCPWM_InitStructure.FAIL1_INPUT_EN = DISABLE; /* FAIL1通道急停功能打开或关闭 */ MCPWM_InitStructure.FAIL1_Signal_Sel = FAIL_SEL_CMP; /* FAIL1事件信号选择,比较器或IO口 */ MCPWM_InitStructure.FAIL1_Polarity = HIGH_LEVEL_VALID; /* FAIL1事件极性选择,高有效或低有效 */ #ifdef MCPWM_SWAP_FUNCTION /* 使用034D, 037E内置预驱芯片需要打开PWM交换功能 */ MCPWM_PRT = 0x0000DEAD; /*enter password to unlock write protection */ MCPWM_SWAP = 0x67; #endif MCPWM_Init(MCPWM0, &MCPWM_InitStructure); /* MCPWM0 模块初始化 */ mIPD_CtrProc.hDriverPolarity = MCPWM_IO01; /* 读出驱动极性 */ } 上电后,指示灯一切正常,接下来就是用官方提供的无感foc代码,其实应该是一个磁链观测器,目前用的比较的多的是滑膜,龙伯格观测器,还有就是扩展卡尔曼观测器,卡尔曼观测器要运行在比较好一点的单片机上,可以一开始就能够电流闭环速度开环,启动的时候很平稳,本人用STM32G431测试过,说了一些废话,现在我们要修改官方提供的代码,修改起来也是比较简单,基本上只需要修改电机参数,电流环和速度环的pid参数,以及启动参数。我这个这个电机没有修改启动参数,只修改了电机参数,就直接跑起来了。很意外。就是在开环启动的时候抖动的厉害,闭环后运行平稳,噪音还可以。因为目前第一步主要做的事能让电机跑起来,启动参数后续在慢慢优化。 /* ------------------------------Motor Parameter------------------------------ */ #define U_MOTOR_PP (8.0f) /*电机极对数 */ #define U_MOTOR_RS (1.537f) /*单位: Ω电机相电阻 */ #define U_MOTOR_LD (2389.0f) /*单位: uH电机d轴电感 #define U_MOTOR_LQ (2450.0f) /* 单位: uH 电机q感 */ 这是对电机参数的修改 #define AMPLIFICATION_GAIN (5.8064516) /*运放放大倍数200;11.2*/ #define RSHUNT (0.050) /*单位: Ω 采样电阻阻值 */ #define VOLTAGE_SHUNT_RATIO (3.3/(47.0 + 3.3)) /* 母线电压分压比 */ #define BEMF_SHUNT_RATIO (3.3/(47.0 + 3.3)) /* 反电势电压分压比 */ #define CURRENT_SAMPLE_TYPE CURRENT_SAMPLE_2SHUNT /* 电流采样方式选择 */ #define ROTOR_SENSOR_TYPE ROTOR_SENSORLESS /* 电机位置传感器类型选择 ROTOR_HALL_SENSOR为有感*/ 这是运放及母线电压的参数,不需要进行修改。 修改完成后,我们直接仿真,直接在程序中struAppCommData.bOpenRunFlag标志位,让其运行起来,开环启动的时候电机有抖动,进入闭环后电机运行平稳,如图:
其实上面有电机的图片都电机都跑起来了,看的不是很明显。 仿真图如下: 至此初步测试完成,后续还需要对启动是的参数做优化,启动有抖动,总体来说对于目前总体的环境下,本方案对于能够快速开发一个无感的foc方案来说是非常棒的,不用在自己慢慢编写观测器代码,不需要用mtlab仿真。对于相差不大的电机,直接修改参数就能运行,大大减小了开发周期。 电机运行的视频地址:https://www.bilibili.com/video/BV1yo4y1h7HC/?buvid=Z04502051A82C4AB404BA003C0510F7C3D18&is_story_h5=false&mid=5z%2FUqHVd9WoCItIuHxAxyA%3D%3D&plat_id=147&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=08BC7483-F861-4174-AC17-AB30189AB58D&share_source=WEIXIN&share_tag=s_i×tamp=1677384563&unique_k=wgW7mrq&up_id=514881840。
|
广告做 的6666