历史上的今天
返回首页

历史上的今天

今天是:2024年10月15日(星期二)

正在发生

2019年10月15日 | 基于STM32无刷直流电机全套设计方案

2019-10-15 来源:eefocus

STM32 BLDC开发板

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


电路原理图如下:

0.png?imageView2/2/w/5500.png?imageView2/2/w/550


  • 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_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                         //TIM3的霍尔输入

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

        

//    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                         //TIM1_BKIN

//    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

//    GPIO_Init(GPIOB, &GPIO_InitStructure);

           

}

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

* Description    : None

* Input          : None

推荐阅读

史海拾趣

台湾富晶(FORTUNE)公司的发展小趣事
确保电源供电稳定,无电压波动或断电现象。
Advanced Linear Devices公司的发展小趣事
使用示波器等工具检查时钟信号的波形和频率是否正常。
General Instrument Optoelectronics公司的发展小趣事
发声电路中的元件(如三极管、蜂鸣器等)可能损坏,或者驱动电路设置不正确。
HM International公司的发展小趣事
确保电源线没有损坏或接触不良。
Amphenol Aerospace公司的发展小趣事
用于测量电压、电流和电阻等参数,帮助诊断电路故障。
AMOTECH(阿莫泰克)公司的发展小趣事

进入21世纪,AMOTECH继续深耕电子领域,特别是在压敏电阻技术上取得了重大突破。2003年,公司的压敏电阻产品被产业资源部评为世界一流产品,这一成就不仅提升了AMOTECH在全球电子行业中的地位,也为其后续发展奠定了坚实基础。同年,公司还成功在韩国安全商协会自动报价首次公开募股,为公司的进一步扩张提供了资金支持。

问答坊 | AI 解惑

M68HC11 单片机大学优秀应用设计汇编

本书收集和整理了16篇1995年举办的\"摩托罗拉M68HC11单片机大学优秀应用设计 竞赛\"获奖的优秀设计,包括一等奖1份、二等奖2份、三等奖3份、优秀奖10份。这些优秀设计绝大多数是针对国民经济建设中的实际问题,利用M68HC11单片机的特点进行的。作 ...…

查看全部问答>

LED损坏的原因及LED电路保护的方法一定要看哦

replyreload += \',\' + 372205;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

wince韩文乱码。显示成了中间有一横杠的'W'

做wince多语言版本,12种语言,其中包括“朝鲜语”。当切换到韩文系统后,韩文可以正常显示,但是\'\\\'符号显示不对,显示成了中间有一横杠的\'W\'。目录字符“\\”都显示成了中间有一横杠的\'W\'。 请指点迷津! 谢谢!…

查看全部问答>

求一个能用的EVC中文模拟器

请发至邮箱 natuly@126.com 谢谢! 这个下不了! http://download.eeworld.net/source/1145384…

查看全部问答>

LCD画图形,怎么擦除上次画的痕迹

while(1) { GrContextForegroundSet(&sContext, ClrWhite); GrCircleDraw(&sContext,sRect.sXMax/2,sRect.sYMax/2,i); GrContextForegroundSet(&sContext, ClrBlack); GrRectFill(&sContext, &sRect); i++; } 我想画 ...…

查看全部问答>

请问PIC18如何扩展片外存储器

1.片外扩展存储器,程序存储器和数据存储器如何区别 2.片外的编址如何,会不会与片内冲突 3.片外如何寻址。C编写 希望高手指点…

查看全部问答>

MSP430中文教材,实例为主,一点即通

MSP430中文教材,实例为主,一点即通 [ 本帖最后由 aishuang 于 2011-7-16 12:09 编辑 ]…

查看全部问答>

三极管共阳极数码管

实验板上4个数码管分别接4个三级管,三极管基极高电平时位选通,低电平时关闭,三极管分别接P2.0---P2.3,能否实现数码管同时4个不同的数字?…

查看全部问答>

个人玩转TPS55010的几点建议

在设计PCB版图的时候,注意焊盘不能用PCB软件里的现成库,要对之进行改造,延长焊盘以便于手工焊接,如果底部有焊盘还需在PCB上开足够大的通孔焊盘,用人工灌锡的办法来焊接底部焊盘。如果是很简单的电路没有制作PCB而使用万用板之类,那么可以将芯 ...…

查看全部问答>

【分享】《ARM Cortex-M0原理与应用实践》

借个地方来发本书,因坛子没有新唐的M0版面,因此书和《51单片机C语言创新教程》同一作者,就发这里了,望版主手下留情。也是给学习51的兄弟提个醒~ ARM的产业生态链已经形成,发觉学51的同学也要了解一下M0,M0主要是针对8/16位的MCU市场,相比M3 ...…

查看全部问答>