×
单片机 > 单片机程序设计 > 详情

基于STM32无刷直流电机全套设计方案

发布时间:2020-08-27 发布时间:
|

STM32 BLDC开发板

提供原理图和相应的原代码,源代码是基于免费开源CoOS(UCOS类似)操作系统上写的,在学习无刷电机的控制同时还能学习到操作系统的知识。同时提供用Matlab的GUI编写的串口接收程序和开源的代码,实时接收速度和电流信息,便于PID测试,并且有CAN(TJA1050)接口。同时自己可以进行修改学习Matlab的GUI编程。


电路原理图如下:

  • STM32F103RB处理器 时钟72M Flash 64K RAM 20K

  • MOSFET SUD35N05-26L  55V 35A Rds=0.02

  • 3. MOSFET驱动 IR2101S

    输入开发板电源

    电源 10到20V

    最大电流 20A

    无刷电机

    额定电压12V

    额定电流  2.26A

    额定转速  13027RPM

    无刷电机接口:

    黄色线: Vcc +5V

    灰色: GND

    棕色:霍尔S1

    蓝色:霍尔S2

    橙色:霍尔S3

    红色:A相

    黑色:B相

    绿色:C相


    开发板配置:

    1.无刷电机驱动

    2.串口通信接口

    3.CAN通信接口

    4.有AD接口能检测电压和电流

    5.两个按键和一个复位键

    6.一个LED

    7.JLINK调试接口

    开发板配件:

    交流220V转直流12V 6A电源  单买价格是40

    带霍尔无刷电机 12V 2.26A                单买价格是 50

    STM32无刷电机驱动板                                            单买价格是180

    软件资料:

    有无刷电机转速调节的PID程序(基于免费开源CoOS操作系统)

    自己做的Matlab GUI串口PID调试程序(开源,自己可以改进)

    自己以前做的STM32程序


    开发板



    无刷电机



    无刷电机的PID调节图


    单片机源程序如下:

    #include "includes.h"

    /********************CoOS变量**********************/

    #define TASK_STK_SIZE         128


    #define TASK0_PRIO        2

    #define TASK1_PRIO  3

    #define TASK2_PRIO  4

    #define TASK3_PRIO  5



    OS_STK STK_TASK0[TASK_STK_SIZE];

    OS_STK STK_TASK1[TASK_STK_SIZE];

    OS_STK STK_TASK2[TASK_STK_SIZE];

    OS_STK STK_TASK3[TASK_STK_SIZE];


    void TASK0(void *param);

    void TASK1(void *param);

    void TASK2(void *param);

    void TASK3(void *param);

    /*************************************************/


    /*********************一般变量********************/

    extern uint32_t Speed_count;

    uint8_t USART_Flag = 0;


    /*************************************************/

    int main(void)

    {

            /* 片内外设初始化 */        

            Periph_Init();

            

            /* 操作系统初始化 */

        CoInitOS();


            CoCreateTask( TASK0, (void*)0, TASK0_PRIO, &STK_TASK0[TASK_STK_SIZE - 1], TASK_STK_SIZE);

            CoCreateTask( TASK1, (void*)0, TASK1_PRIO, &STK_TASK1[TASK_STK_SIZE - 1], TASK_STK_SIZE);

            CoCreateTask( TASK2, (void*)0, TASK2_PRIO, &STK_TASK2[TASK_STK_SIZE - 1], TASK_STK_SIZE);

            CoCreateTask( TASK3, (void*)0, TASK3_PRIO, &STK_TASK3[TASK_STK_SIZE - 1], TASK_STK_SIZE);

            CoStartOS();

        while(1);

    }


    void TASK0(void *param)

    {

      uint8_t start_flag=0;

      uint8_t sw_state = 1;

      KEY_Init();

      Speed_PIDInit();                        

      for(;;)

      {

              //SW__Read()=1          Direction = SET

        if(SW__Read()^sw_state)

            {

               if(start_flag)

               {

                       BLDC_Stop();

               }

               sw_state = SW__Read();

               if(sw_state)

               {

                               Direction = SET;

               }

               else

               {

                               Direction = RESET;

               }

               if(start_flag)

               {

                         BLDC_Start();

               }

            } 

        if(KEY_Read(KEY1))

            {

                    CoTickDelay(5);

                    if(KEY_Read(KEY1))

                    {

                       BLDC_Start();

                       start_flag = 1;        

                    }

            }

            if(KEY_Read(KEY2))

            {

                    CoTickDelay(5);

                    if(KEY_Read(KEY2))

                    {

                       BLDC_Stop();

                       start_flag = 0;

                    }

            }

            CoTickDelay(10);

      }                        

    }

    void TASK1(void *param)

    {

      uint16_t adc_value= 0;

      uint8_t i = 0; 

      for(;;)

      {

                 adc_value= 0;

           for(i=0;i<4;i++)

               {

                               ADC_SoftwareStartConvCmd(ADC1,ENABLE);    /* 使能转换开始 */

                               while(ADC_GetSoftwareStartConvStatus(ADC1));

                            adc_value += ADC_GetConversionValue(ADC1);

               }

               ADC_Speed = adc_value/4;

               CoTickDelay(10);

      }

    }

    void TASK2(void *param)

    {

      uint16_t data;

      for(;;)

      {

              if(USART_Flag)

            {

                data = 1000000/(6*Speed_count);

                    USART_SendData( USART2, data);

                    USART_Flag = 0;

            }

            CoTickDelay(1);

      }

    }

    void TASK3(void *param)

    {

            LED_Off();

      for(;;)

      {

               LED_On();

               CoTickDelay(200);

               LED_Off();

               CoTickDelay(200);

      }

    }

    复制代码


    #include "includes.h"


    /**********常量定义**********/

    #define IDLE    0

    #define        START        1

    #define        RUN            2

    #define        STOP    3

    #define FAULT   4

    #define HIGH        1480

    #define LOW     3

    /*********全局变量***********/

    u8 state;                                   //主状态

    FlagStatus Direction = SET;//初始化后为正转

    uint8_t stalling_count = 0;                   //堵转计数器


    void Delay_us(uint8_t t);

    /**********************************************************************

    * Description    : 对定时器1和定时器3的GPIO定义

    * Input          : None

    * Output         : None

    * Return         : None

    * Attention      : None

    **********************************************************************/

    void BLDC_GPIOConfig(void)

    {

        GPIO_InitTypeDef GPIO_InitStructure;

              

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;  //TIM1输出

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                   

            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOA, &GPIO_InitStructure);

                             

            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//TIM1输出

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                                                   

            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

        GPIO_Init(GPIOB, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;              //TIM3的霍尔输入

    GPIO_InitStructu


    关键字:STM32  无刷  直流电机 

    『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

    热门文章 更多
    如何为单片机选择合适的负载电容