历史上的今天
今天是:2024年10月15日(星期二)
2019年10月15日 | 基于STM32无刷直流电机全套设计方案
2019-10-15 来源:eefocus
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_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
史海拾趣
|
本书收集和整理了16篇1995年举办的\"摩托罗拉M68HC11单片机大学优秀应用设计 竞赛\"获奖的优秀设计,包括一等奖1份、二等奖2份、三等奖3份、优秀奖10份。这些优秀设计绝大多数是针对国民经济建设中的实际问题,利用M68HC11单片机的特点进行的。作 ...… 查看全部问答> |
|
做wince多语言版本,12种语言,其中包括“朝鲜语”。当切换到韩文系统后,韩文可以正常显示,但是\'\\\'符号显示不对,显示成了中间有一横杠的\'W\'。目录字符“\\”都显示成了中间有一横杠的\'W\'。 请指点迷津! 谢谢!… 查看全部问答> |
|
while(1) { GrContextForegroundSet(&sContext, ClrWhite); GrCircleDraw(&sContext,sRect.sXMax/2,sRect.sYMax/2,i); GrContextForegroundSet(&sContext, ClrBlack); GrRectFill(&sContext, &sRect); i++; } 我想画 ...… 查看全部问答> |
|
在设计PCB版图的时候,注意焊盘不能用PCB软件里的现成库,要对之进行改造,延长焊盘以便于手工焊接,如果底部有焊盘还需在PCB上开足够大的通孔焊盘,用人工灌锡的办法来焊接底部焊盘。如果是很简单的电路没有制作PCB而使用万用板之类,那么可以将芯 ...… 查看全部问答> |
|
借个地方来发本书,因坛子没有新唐的M0版面,因此书和《51单片机C语言创新教程》同一作者,就发这里了,望版主手下留情。也是给学习51的兄弟提个醒~ ARM的产业生态链已经形成,发觉学51的同学也要了解一下M0,M0主要是针对8/16位的MCU市场,相比M3 ...… 查看全部问答> |




