极海APM32F035电机控制专用MCU

这篇具有很好参考价值的文章主要介绍了极海APM32F035电机控制专用MCU。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       去年11月份一次偶然的机会,看到面包板论坛提供极海半导体针推出的低压电机测试板,此电机控制板基于专用控制芯片APM32F035基础上设计而成。APM32F035是一款基于Arm Cortex-M0+内核,集成FOC算法中常用的数学运算加速器(Cordic,Svpwm,硬件除法器等),并且集成了运放、比较器等模拟外设,以及CAN控制器的高性能电机控制专用MCU。

       评估板拿到手后,第一时间用手头直流无刷电机测试了下,检查KEIL版本是否V5.23以上,安装DEVICE Package  Geehy.APM32F035_DFP.1.0.0, 同时检查编译器里是否含有C99和GNU,如上都准备好以后,下载重新编译的hex文件到DEMO板里,首先直接测试有感矢量控制方案程序。启动后低速时转动有些轻微抖动,速度起来后,转速正常,抖动消除。

低压电机通用评估板介绍:
电气参数:12-72VDC 宽电压输入,最大功率100W
支持电机类型:BLDC.PMSM
支持编码器类型:霍尔,光电,磁编码器
通讯接口:SCI/SPI/I2C/C电流采样方式:单、双电阻采样, 三相反电动势采样

评估板图片:

极海APM32F035电机控制专用MCU,c语言,嵌入式硬件

软件算法平台介绍:

极海APM32F035电机控制专用MCU,c语言,嵌入式硬件

具体调试步骤如下:
1.    准备工作
首先需要先核对板子的硬件是否正常,首次上电后,先拿示波器或万用表核对硬件板子上各个电压端点是否稳定(12V、5V、3.3V)等,以及测量IV、IU、IBUS等端点是否为直流偏置电(1.60V) 。 同时准备好无刷直流电机和烧录器。

2.    外设配置
核对电机的硬件外设管脚的配置情况,如M0CP协处理器、TMR1的PWM波形配置、TMR2的捕获配置、ADC采样端口配置、运放OPA的端口初始化、比较器COMP的配置以及核心点采用COMP与TMR1的级联使用刹车功能(即硬件过流保护功能,细节可查阅原理图)。如下所示:(注:未具体展开各个细节,需结合原理图及各个外设配置文件进行核对。)

3.    电机参数配置
前面两步骤主要是核对硬件及外设配置,先确保硬件基础的稳定及准确,而后才开始电机部分的调试。 打开“parameter.h”参数配置文件,此文件是重中之重,基本大部分的修改都在此文件中进行,划重点啦!首先肯定需要先核对电机的参数嘛! 此篇章主要介绍的是有感FOC的开发,因此需要核对电机的极对数、额定转速、限制电流(结合电机的功率考虑)、定标转速(结合额定转速评估)等。如下图所示。 (注:此处补充下,有感FOC无需使用到观测器这块,因此无需用到电机的相电阻、相电感等参数,而若是无感FOC基本都是需要知道电机的相电阻、相电感、甚至是反电动势常数等)

4.    电流内环的PI参数进行整定确认
在Align状态中进行调试,调节DQ轴下的电流环PI参数(如下图所示,一般DQ轴采用一样的PI参数),类似其中的Q轴,通过给定Iq_cmd(可以直接给到值或者采用斜坡给定的方式设定一定加速度及数值),通过观察Vq的输出是否能快熟稳定、以及Iq_cmd及实际的Iq波形数据是否能跟随上,判断当前的PI参数是否合适。案例波形如下图所示。

极海APM32F035电机控制专用MCU,c语言,嵌入式硬件

5.    HALL角度自检
当电流内环PI参数已经合适时,此时说明可以使用预定位功能,则开启HALL相序的自检功能。还是在“parameter.h”参数配置文件中,打开“HALL_PHASE_TEST”宏参,进行HALL相序的自检功能,在此先介绍下HALL相序的作用,HALL的相位角度差是60°,即其可以输出六个角度点,类似按照正转CW的方式HALL值输出如2-6-4-5-1-3。(注:可以先自行测试HALL的相序顺序是否与程序中给的一致,可以通过手动让电机其转动一圈看看实际读到的hall值,确认hall正转与反转的顺序,并将对应的hall相序进行核对,类似读出是6-4-5-1-3-2,与上述设定顺序一致则无需修改,而若出现类似6-4-1-5-2-3这种与程序中的顺序不相符的,将该顺序填入user_function.c中的u8CW_Hall_Value与u8CCW_Hall_Value数组列表中,同时也需要对应填写下CW_hall_table与CCW_hall_table数组列表。 

u8CW_Hall_Value[6]:表示实际的霍尔序列,注意霍尔序列与角度序列的对应关系; 
CW_hall_table[8]:前一个位置的霍尔值序列,例如程序内hall:1的前一个位置是hall:5

CW_hall_table[1] = 5,hall:2的前一个位置是hall:3,CW_hall_table[2] = 3 以此类推:u8CW_Hall_Value[6]={ 1,3,2,6,4,5},对应CW_hall_table[8]={ 0,5,3,1,6,4,2,0}; u8CW_Hall_Value[6]={ 2,3,1,6,4,5},对应CW_hall_table[8]={ 0,3,5,2,6,4,1,0})。

其次,重点又来了哈!实际HALL传感器的安装位置与电机对应的机器角度间是会有安装角度偏差的,即机器角度偏差角,此时HALL相序的自检功能就是为了计算出该偏差角,并把HALL值对应的实际角度一一匹配上。如下图所示,开启“HALL_PHASE_TEST”宏参后进入调试模式,观察“stc_align_hall”该结构体的相关成员变量,配置函数“Align_HallCal_Phase_Init”与“Align_HallCal_Phase”实现,核心参数修改主要在于定位时间以及定位Iq电流的设定,以及偏移角度的设定(若检测角度异常可适当调节该值,常用推荐0“0°”或者5461“30°”的偏移角度)。如“stc_align_hall”中的“u8Dir”表示方向,s16CW_arr_HallPhase_Cal 与 s16CCW_arr_HallPhase_Cal是最终生成计算获取HALL相序角度表,需将其填入user_function.c中的“s16CW_arr_HallPhase”与“s16CCW_arr_HallPhase”数组列表中。

6.    速度环参数整定
当已将HALL相序角度表获取并填入后,需在“parameter.h”参数配置文件中,先关闭下“HALL_PHASE_TEST”宏参,关闭HALL自检模式,到了这一步,就准备尝试让电机开始运转测试啦! 调节硬件板上的转速旋钮,正常情况下电机是可以运行起来的,若运行不起来,此时需要回头去核对前面的相应步骤按点确认异常;若可运行但是转速不稳定,则此时又到重点啦!开始记笔记!当转速不稳定时,此时需要进一步调节速度环的pi参数以及需要核对电机给定的加速度是否合理。PI的调节还是跟之前调电流环PI的模式类似,先调节Kp再加入Ki,数值从小到大进行调试验证,通过观测实际输出Iq_CMD的稳定趋势、给定的斜坡转速spd_ramp与实际转速spd_filt的跟随曲线进行判断参数的合理性。如下图所示。

极海APM32F035电机控制专用MCU,c语言,嵌入式硬件

7.    关键参数设置
此系统中所有参数均在用户层的parameter.h中进行配置,主要分为系统参数、底板相关参数、状态机相关参数、电机相关参数等。

8.    定制电机开发
自此,无刷直流电机已经成功被你运转起来啦,接下来的就是依据你实际的开发需求添加应用层逻辑等做定制化开发自己产品功能啦!!!

总体评价:

整板设计思路:
        整体硬件系统是采用外部 24V 电源供电, 并经过相应的电源降压电路转换后输出稳定的12V、5V 、3.3V电压, 其中12V电压输出给到Gate driver IC、3.3V电压输出给到APM32F035系列微处理器,而功率开关管则直接使用 24V电源。同时,该方案采用可变电阻旋钮调节 0~3.3V 的电压输入作为速度命令的输入端, 以此调节电机转速。用户实际使用可直接通过转动可变电阻旋钮以此调节输入电压,同时当输入电压值超过起动阈值时,电机将会启动运行, 而当电压值低于阈值时电机将会关闭运行。当电机启动后,通过捕获HALL信号的跳变情况进而确认六个换相点,进行对应六种不同的逆变器MOS管驱动顺序实现BLDC电机的六步换相。

程序设计架构主要划分为4层,用户层、外设驱动层、电机控制驱动层以及电机算法层,具体功能描述如下:
1.    用户层(USER层)
main.c:主函数入口,负责初始化电机参数、底层外设、中断优先级、while循环及低速状态机
环路的切换; 
apm32f035_int.c:所有的中断处理函数,重点包括捕获中断函数、ADC中断处理函数; 
user_function.c:包括电机参数的初始化配置、参数复位等处理函数; 
paramete.h:包括了所有的需要配置参数信息;

2.    外设驱动层(HARDWARE层)
外设驱动层主要负责APM32F035芯片的外设驱动函数及配置,主要涉略包括GPIO、PWM、ADC、OPA、COMP、M0CP协处理器等
3.    电机控制驱动层(MOTOR_CONTROL层)
电机控制驱动层主要负责电机的控制运行逻辑及核心处理算法调用。
4.    电机算法层(Geehy_MCLIB层)
电机算法层包含坐标变换,矢量控制等相关函数,数学库,HALL角度估算等库函数。
经过测试发现,此测试板为黑色油墨,电路简单实用,版面设计简洁明了,布局合理,能满足中小功率无刷直流电机的驱动要求,在上电启动后,转速很慢时,明显有卡顿的情况, 转速起来后,卡顿情况消失,这点可能因电机个体参数差异,需要调整PID参数优化控制过程,至于程序代码部分采用了主状态机嵌套子状态机的结构,同时主状态RUN的六个子状态轮流切换工作。如需开发自己的项目功能,需要增加自己的功能函数模块。

       另外在调试仿真过程中,不能够连续读取变量参数,不能设置断点连续运行,经常停止或死机,由于时间问题,没有详细查找原因,不知是芯片底层驱动的问题还是KEIL 仿真参数没设置正确, 但是使用STM32的芯片仿真调试时,没有出现如上同样问题。以上是个人测试使用过程中遇到的问题,仅代表个人观点,仅供参考。欢迎各位工程师一起学习交流。调试时,没有出现如上同样问题。以上是个人测试使用过程中遇到的问题,仅代表个人观点,仅供参考。欢迎各位工程师一起学习交流。

代码部分:

#ifndef __PARAMETER_H_
#define __PARAMETER_H_

/*System setting*/
#define SYS_REFV                                    3.3f       //  unit:v      MCU VCC must be 5.0V or 3.3V         
#define SYSCLK_HSE_72MHz                            72000000   //  unit:Hz

#define PWMFREQ                                     16000      //  unit:Hz
#define PWM_PERIOD                                  (SYSCLK_HSE_72MHz/PWMFREQ/2)
#define DEAD_TIME                                   (1.0f * SYSCLK_HSE_72MHz/1000000)      //  unit:us  
#define SLOWLOOP_FREQ                               1000       //  unit:Hz
#define SLOWLOOP_FREQ_KHZ                           1          //  uint:Khz
#define TS_Q21                                      (2097152/PWMFREQ)   // 8kHz:262
/*  timer2 parameter    */
#define TIM2_TCY                                    1       //Time base unit of TIM2(us)  
#define TIM2_PSC_LOAD                               (SYSCLK_HSE_72MHz/1000000*TIM2_TCY-1)  //TIM2 Load Value
#define TIM2_PRIOD                                  99999       //TIM2 Period Value
/*Board parameter setting*/
/*Current Sampling*/
#define ADC_REFV                                    SYS_REFV
#define R_SHUNT                                     (0.02f)    //  unit:ohm
#define CURRENT_OPA_GAIN                            (4.86f)    //  unit:ohm 使用2K/10K电阻组合,结合内部耦合电阻计算得出
#define I_MAX                                       (16.46f)   //  偏置1.6V,I_MAX=1.6/Gain/Rs

t ramp_s16(int16_t s16_Cmd,ramp_para_t *pstc)
{
    int32_t s32_RefIn;
    int16_t s16_Out;
    if(s16_Cmd > pstc->s16_Max)
    {
        s32_RefIn = pstc->s16_Max << 5;
    } else if(s16_Cmd < pstc->s16_Min)
    {
        s32_RefIn = pstc->s16_Min << 5;
    } else
    {
        s32_RefIn = s16_Cmd << 5;
    }

    if (s32_RefIn != pstc->s32q20_OutTemp)
    {
        if (pstc->s32q20_OutTemp > 0 )
        {
            if (s32_RefIn > pstc->s32q20_OutTemp)
            {
                // 加速
                pstc->s32q20_OutTemp += pstc->s16q20_Inc;
                
                if ( s32_RefIn < pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
                
            }else
            {
                // 减速
                pstc->s32q20_OutTemp -= pstc->s16q20_Dec;
                
                if ( s32_RefIn > pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
                
            }            
        }else if(pstc->s32q20_OutTemp < 0)
        {
            if (s32_RefIn < pstc->s32q20_OutTemp){
                // 加速
                pstc->s32q20_OutTemp -= pstc->s16q20_Inc;
                  
                if ( s32_RefIn > pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
                
            }else
            {
                // 减速
                pstc->s32q20_OutTemp += pstc->s16q20_Dec;
                
                if ( s32_RefIn < pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
                
            }   
        }else
        {
            if (s32_RefIn < pstc->s32q20_OutTemp)
            {
                // 加速
                pstc->s32q20_OutTemp -= pstc->s16q20_Inc;
                if ( s32_RefIn > pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
            }else
            {
                // 加速
                pstc->s32q20_OutTemp += pstc->s16q20_Inc;
                
                if ( s32_RefIn < pstc->s32q20_OutTemp )
                    pstc->s32q20_OutTemp = s32_RefIn;
                
            }  
        }
    }
    s16_Out = pstc->s32q20_OutTemp >> 5;
    return s16_Out;
}

int main(void)
{
    __disable_irq();                           
    /*  config peripherals  */
    MC_SystemClockInit();
    /*  M0CP    */
    M0CP_Firmware_Init();
    RCM_EnableAHBPeriphReset(RCM_AHB_PERIPH_M0CP);
    RCM_DisableAHBPeriphReset(RCM_AHB_PERIPH_M0CP);
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_M0CP);
    M0CP_HardInit();
    *(volatile unsigned int*)(0x40024000+0x10) = 0;
    /*  TIMER1      */
    Drv_Pwm_Init(PWM_PERIOD,DEAD_TIME);
    PWM_CompareConfig(PWM_PERIOD, PWM_PERIOD, PWM_PERIOD);
    /*  TIMER2 for hall capture     */
    timer2_init(TIM2_PRIOD, TIM2_PSC_LOAD);    //100ms
    /*  ADC      */
    Drv_Adc_Init();
    /*  OPA      */
    OPA_Init();
    /*  COMP      */
    COMP_Init();
    /*  GPIO      */
    IO_Init();
    /*  SYSTICK      */
    Systick_Init(SystemCoreClock / 1000);
    /* Initialize  motor control parameters */
    Init_Parameter(&Motor_type);
    /* Initialize interrupts */
    Interrupt_Init(); 
    /* Wait until ADC is ready */
    while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
    ADC_StartConversion();
    WWDTInit();
    __enable_irq();                             //Enable all interrupts
    TMR_EnablePWMOutputs(TMR1);
    
    while (1)
    {
        if(Motor_type.User.bSlowLoopFlag)
        {
            WWDTFeedDog();
            /* Slow Loop Statemachine */
            s_STATE_SLOW[eM1_MainState]();
            Motor_type.User.bSlowLoopFlag =  0;
        }
    }
}

由于代码部分较长,不再一一贴出来,如有如要,留言联系我,可以提供相关资料或站内其他帖子内下载,另外提醒所提供资料仅供学习使用。

实际测试波形:

极海APM32F035电机控制专用MCU,c语言,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-777437.html

到了这里,关于极海APM32F035电机控制专用MCU的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32F103单片机pwm控制伺服驱动器进而控制步进电机

    1.需要一台步进电机,私服驱动器,stm32单片机;先按照说明文档,连接好硬件相关线路,对应好sign+,sign-,puls+,puls-线路,其中sign只是个io口拉高拉低操作,puls是pwm波形输出口,虽然有两根线,但只是需要控制一个IO口输出波形即可; 采用主从模式,TIM1为主定时器,tim3未从定

    2024年02月04日
    浏览(39)
  • 【STM32F4系列】【HAL库】电机控制(转速和角度)(PID实战1)

    实现电机最常使用的两个功能, 转速控制 和 位置控制 使用PID闭环控制(控制线性系统最简单快捷的控制方法) 为了实现 控制电机转动 和 闭环控制 需要: 电机(废话) 编码器( 霍尔编码器 或者 光电编码器 均可) 电机驱动(这里选的是 l298n模块 ) 千万注意黑色的地线,单片机的地要

    2024年02月02日
    浏览(35)
  • STM32F103C8T6实现CAN通讯与直流编码电机转速闭环控制

    本次实验目的是通过CAN发送目标转速与转向信息,接收方在接到CAN数据流后开始对直流编码电机进行转速闭环控制。我会尽量说清每个函数,注释每一句代码,希望能对大家有所帮助。 CAN通讯基于STM32自带CAN通讯模块,配合库函数使用十分方便。关于CAN通讯可以参考站内大佬

    2023年04月08日
    浏览(26)
  • stm32f103使用DM542控制42相步进电机的原理和可行性分析

    步进电机是一种能够实现准确位置控制的电机,通常应用于需要高精度定位的场合,例如3D打印机、机器人和自动化系统等。而STM32F103是一种高性能、低功耗的微控制器,它拥有广泛的外设,适合用于控制各种电机。本文将介绍使用STM32F103控制DM542驱动器驱动42相步进电机的原

    2024年02月15日
    浏览(31)
  • 基于STM32F103C8T6使用Arduino IDE编程闭环控制4个带编码器的有刷直流电机

    题记:标题有点长了,纯粹为了方便被检索到~~~本贴主要用于支持南方科技大学SDIM学院工业设计专业大三综合项目移动底盘学习,也是我自己按照费曼学习方法的一次尝试,用从底层搭建一个机器人底盘来复习自动控制原理。         由于工业设计专业没有开设嵌入式课程

    2024年02月05日
    浏览(30)
  • 极海MCU---keil5手动添加Pack

    下载pack文件 进入极海半导体官网,技术支持 点进去下拉,找到软件支持,找到对应的芯片(我使用的是APM32F1XX); 软件支持中包括pack和SDK,SDK中有库文件和一些例程,开发时会用到,都下载下来。 keil5中安装pack 打开keil5,点击Pack Installer; 进入Pack Installer界面后,点击F

    2024年02月15日
    浏览(47)
  • 无刷直流电机32位MCU解决方案

    电机是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩,作为用电器或各种机械的动力源。发电机在电路中用字母G表示。它的主要作用是利用电能转化为机械能。 无刷直流电动机的工作原理:无刷直流电机是永磁式同步电机的一种,

    2024年02月12日
    浏览(25)
  • 【正点原子STM32连载】第三十三章 待机模式实验 摘自【正点原子】APM32F407最小系统板使用指南

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html## 本章介绍APM32F407低功耗模式中的待机模式,进入待机模式后,MCU内部的电压调压器将断开1.3V电源域

    2024年02月07日
    浏览(30)
  • 【正点原子STM32连载】第十五章 窗口看门狗实验 摘自【正点原子】APM32F407最小系统板使用指南

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 本章介绍APM32F407窗口看门狗(WWDT)的使用,窗口看门狗与独立看门狗一样能够帮助CPU在进入错误状

    2024年02月12日
    浏览(32)
  • 【正点原子STM32连载】 第四十三章 SPI实验 摘自【正点原子】APM32F407最小系统板使用指南

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html## 本章将介绍使用APM32F407驱动板载的NOR Flash进行读写操作。通过本章的学习,读者将学习到使用SPI驱

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包