打印
[LKS32 软件]

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

[复制链接]
1144|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# #申请开发板#
有幸能有这次测评的机会,LKS32MC037是主频48mHZ,集成了3P3Nmos预驱,预驱电压在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,3N端死区时间设置 */
    MCPWM_InitStructure.DeadTimeCH0123P = DEADTIME;           /* 通道0,1,2,3P端死区时间设置 */
#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;           /* 通道交换选择设置 | CH0PCH0N是否选择信号交换 */
    MCPWM_InitStructure.Switch_CH1N_CH1P =  DISABLE;           /* 通道交换选择设置 */
    MCPWM_InitStructure.Switch_CH2N_CH2P =  DISABLE;           /* 通道交换选择设置 */
    /* 默认电平设置 默认电平输出不受MCPWM_IO01MCPWM_IO23BIT0BIT1BIT8BIT9BIT6BIT14
                                                     通道交换和极性控制的影响,直接控制通道输出 */
    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;           /* 通道交换选择设置 | CH0PCH0N是否选择信号交换 */
    MCPWM_InitStructure.Switch_CH1N_CH1P =  DISABLE;           /* 通道交换选择设置 */
    MCPWM_InitStructure.Switch_CH2N_CH2P =  DISABLE;           /* 通道交换选择设置 */
    /* 默认电平设置 默认电平输出不受MCPWM_IO01MCPWM_IO23BIT0BIT1BIT8BIT9BIT6BIT14
                                                     通道交换和极性控制的影响,直接控制通道输出 */
    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。

























11.jpg (255.55 KB )

11.jpg

使用特权

评论回复
评论
80后小老头 2023-3-20 19:12 回复TA
广告做 的6666 
沙发
chenjun89| | 2023-3-20 21:46 | 只看该作者
这个开发板可以直接用Jlink下载吗?

使用特权

评论回复
板凳
mintspring| | 2023-3-22 22:58 | 只看该作者
MOS管很贵吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

55

帖子

1

粉丝