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
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』