emanages 发表于 2023-2-26 12:25

凌鸥创芯电机开发板LKS32MC037E+foc

#申请原创# #申请开发板# 有幸能有这次测评的机会,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&timestamp=1677384563&unique_k=wgW7mrq&up_id=514881840。
























chenjun89 发表于 2023-3-20 21:46

这个开发板可以直接用Jlink下载吗?

mintspring 发表于 2023-3-22 22:58

MOS管很贵吗?
页: [1]
查看完整版本: 凌鸥创芯电机开发板LKS32MC037E+foc