单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

2023-05-16

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

在这里插入图片描述

在这里插入图片描述

1.STM32F103RB处理器 时钟72M Flash 64K RAM 20K
2.MOSFET SUD35N05-26L 55V 35A Rds=0.02
3. MOSFET驱动 IR2101S

在这里插入图片描述

在这里插入图片描述

部分代码:
main.c

#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);
  }
}

BLDC.c

#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
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void BLDC_TIM1Config(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;			   //»ù±¾½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_OCInitTypeDef  		TIM_OCInitStructure;               //Êä³ö½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_BDTRInitTypeDef  	TIM_BDTRInitStructure;			   //ËÀÇøɲ³µ½á¹¹Ìå±äÁ¿¶¨Òå

   TIM_DeInit(TIM1);

   TIM_TimeBaseStructure.TIM_Prescaler = 2;					   //TIM»ù±¾³õʼ»¯
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned2;//ÖÐÑë¶ÔÆë¼ÆÊýģʽ,Êä³ö±È½Ï±ê־λֻÓÐÔڱȽÏÆ÷ÏòÉϼÆËã±»ÉèÖÃ
   TIM_TimeBaseStructure.TIM_Period = 1500 - 1;					   //PWM 16K
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;				   

   TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		   //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; 
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;                  
   TIM_OCInitStructure.TIM_Pulse =1200; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;         
   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//TIM_OCIdleState_Set;
   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;          
  
   TIM_OC1Init(TIM1,&TIM_OCInitStructure); 

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC2Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_Pulse =1200;
   TIM_OC3Init(TIM1,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		   //TIMÊä³öͨµÀ4³õʼ»¯£¬ÓÃÀ´´¥·¢AD×¢Èë²ÉÑù
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;                   
   TIM_OCInitStructure.TIM_Pulse =1495; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;           
  
   TIM_OC4Init(TIM1,&TIM_OCInitStructure); 
 
   TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;	//ËÀÇøɲ³µ³õʼ»¯
   TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
   TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; 
   TIM_BDTRInitStructure.TIM_DeadTime = 100;
   TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;	 //Èç´ò¿ª£¬¿ª»úÎÞÊä³öÇÒ״̬ÎÉÂÒ£¿£¿£¿£¿
   TIM_BDTRInitStructure.TIM_BreakPolarity =  TIM_BreakPolarity_Low ;
   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

   TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);


   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ£¨Í¨µÀ1£©

   TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);	 //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ£¨Í¨µÀ2£©

   TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);	 //ʹÄܲ¶»ñ±È½Ï¼Ä´æÆ÷ԤװÔØ£¨Í¨µÀ3£©
   
   TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);        //ÊäÈë´¥·¢Ô´Ñ¡ÔñTIM3   
  
   //TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Trigger);//´ÓģʽѡÔñ ´¥·¢	  

   TIM_CtrlPWMOutputs(TIM1,ENABLE);

//   TIM_ClearITPendingBit(TIM1, TIM_IT_Break|TIM_IT_COM);
//   TIM_ITConfig(TIM1, TIM_IT_Break | TIM_IT_COM ,ENABLE);
   TIM_ClearITPendingBit( TIM1, TIM_IT_COM);
   TIM_ITConfig(TIM1, TIM_IT_COM ,ENABLE);

   TIM_Cmd(TIM1,ENABLE);
}
/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void BLDC_TIM3Config(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;			   //»ù±¾½á¹¹Ìå±äÁ¿¶¨Òå
   TIM_ICInitTypeDef  TIM_ICInitStructure;                      //¶¨Òå½á¹¹Ìå±äÁ¿
   TIM_OCInitTypeDef  TIM_OCInitStructure;                     //Êä³ö½á¹¹Ìå±äÁ¿¶¨Òå
      
   TIM_DeInit(TIM3);

   TIM_TimeBaseStructure.TIM_Prescaler = 71;				   //TIM»ù±¾³õʼ»¯
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseStructure.TIM_Period =65535;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

   TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     
      
   TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //Ñ¡ÔñͨµÀ1
   TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //ÊäÈëÉÏÉýÑز¶»ñ  
   TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //ÅäÖÃͨµÀΪÊäÈ룬²¢Ó³Éäµ½ÄÄÀï
   TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //ÊäÈ벶»ñÔ¤·ÖƵֵ
   TIM_ICInitStructure.TIM_ICFilter = 10;                      //ÊäÈëÂ˲¨Æ÷´ø¿íÉèÖÃ

   TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //ÊäÈëͨµÀÅäÖÃ

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 		    //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;             
   TIM_OCInitStructure.TIM_Pulse =1023; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  
   TIM_OC2Init(TIM3,&TIM_OCInitStructure);

   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; 		    //TIMÊä³öͨµÀ³õʼ»¯
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;             
   TIM_OCInitStructure.TIM_Pulse =65535; 
   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  
   TIM_OC4Init(TIM3,&TIM_OCInitStructure);

   TIM_SelectHallSensor(TIM3,ENABLE);                          //ʹÄÜTIMxµÄ»ô¶û´«¸ÐÆ÷½Ó¿Ú
   
   TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //ÊäÈë´¥·¢Ô´Ñ¡Ôñ   
  
   TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //´ÓģʽѡÔñ

   TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//Ö÷´ÓģʽѡÔñ        
   
   TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);      //Ñ¡ÔñÊä³ö´¥·¢Ä£Ê½(TRGO¶Ë)

   TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //¿ª¶¨Ê±Æ÷ÖÐ¶Ï 
   //TIM_Cmd(TIM3,ENABLE);
}
/**********************************************************************
* Description    : None
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
**********************************************************************/
void huanxiang(void)
{
  u8 Hall_data = 0; 
  Hall_data=(u8)((GPIOA->IDR&0x000000c0)>>6);	//¶Áת×ÓλÖÃ
  Hall_data|=(u8)((GPIOB->IDR&0x00000001)<<2);
  if(Direction)
  {									 //Õýת
    switch(Hall_data)				 //¸ù¾Ýת×ÓλÖ㬾ö¶¨CCERÊä³öÏàλºÍת×Ó×ÖÆ«ÒÆÁ¿
    {
	  case 0x05:{	                      												
			  	  TIM1->CCER=0x3081;    //1,4
			    };break;
	  case 0x04:{
				  TIM1->CCER=0x3180;	//4,5	          	   
	            };break;							
  	  case 0x06:{
				  TIM1->CCER=0x3108;	//2,5
			    };break;
	  case 0x02:{
				  TIM1->CCER=0x3018;	//2,3	          		
	            };break;
	  case 0x03:{
				  TIM1->CCER=0x3810;	//3,6	          		
	            };break;
	  case 0x01:{
	             			
				  TIM1->CCER=0x3801;    //1,6	          		
	            };break;
	  default:break;
    }  
  }
  else
  {									 //·´×ª
	switch(Hall_data)				 //¸ù¾Ýת×ÓλÖ㬾ö¶¨CCERÊä³öÏàλºÍת×Ó×ÖÆ«ÒÆÁ¿
    {
	  case 0x05:{	  										
			  	  TIM1->CCER=0x3018; //2 3 
			    };break;
	  case 0x04:{
				  TIM1->CCER=0x3810; //3 6 		          	   
	            };break;							
  	  case 0x06:{
	  				TIM1->CCER=0x3801; //1 6
			    };break;
	  case 0x02:{
				  TIM1->CCER=0x3081; //1 4		          		
	            };break;
	  case 0x03:{
				  TIM1->CCER=0x3180; //4 5		          		
	            };break;
	  case 0x01:{
	  			  TIM1->CCER=0x3108; //2 5  	              				          		
	            };break;
	  default:break;
    }
  }
}
/**************Æô¶¯******************/
void BLDC_Start(void)
{
   TIM1->SMCR|=0x0006;        //¿ªTIM1µÄÊäÈë´¥·¢	
   TIM1->DIER=0x0040;         //¿ªTIM1µÄ´¥·¢ÖжÏ
   huanxiang();			      //µ÷Óû»Ïòº¯Êý£¬Æô¶¯			  					 
   TIM3->CR1|=0x0001;		  //¿ªTIM3
   TIM3->DIER|=0x0050;		  //¿ªTIM3ÖÐ¶Ï  
}
void BLDC_Stop(void)
{
   TIM1->SMCR&=0xfff8;		  //¹Ø±ÕTIM1µÄÊäÈë´¥·¢
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö
   Delay_us(40);			      //ÑÓʱ£¨¼ÓËÀÇø£©
   TIM1->CCER=0x0ccc;         //´ò¿ªÈý·Ï¹ܣ¬½øÐÐÄܺÄÖƶ¯
   while(stalling_count<1);    //µÈ´ýµç»úÍ£Ö¹£¨TIM3Á¬ÐøÒç³ö10´Î£¬¼´ÈÏΪµç»úÒÑͣת£©   
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö£¬¹Øɲ³µ		  
   TIM3->CR1&=0xfffe;         //¹Ø±ÕTIM3						  
   TIM3->CNT=0;               //ÇåTIM3µÄ¼ÆÊýÆ÷				   
   TIM3->DIER&=0xffaf;		  //¹ØTIM3ÖжÏ
}
void Delay_us(uint8_t t)
{
   while(t--)
   {
   }
}
/**************Í£Ö¹******************/
/*void stop(void)
{
   TIM1->SMCR&=0xfff8;		  //¹Ø±ÕTIM1µÄÊäÈë´¥·¢
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö
   Delay(20);			      //ÑÓʱ£¨¼ÓËÀÇø£©
   TIM1->CCER=0x0ccc;         //´ò¿ªÈý·Ï¹ܣ¬½øÐÐÄܺÄÖƶ¯
   while(duzhuan_value<1);    //µÈ´ýµç»úÍ£Ö¹£¨TIM3Á¬ÐøÒç³ö10´Î£¬¼´ÈÏΪµç»úÒÑͣת£©   
   TIM1->CCER=0;              //¹Ø±ÕTIM1µÄÁù·Êä³ö£¬¹Øɲ³µ		  
   TIM3->CR1&=0xfffe;         //¹Ø±ÕTIM3						  
   TIM3->CNT=0;               //ÇåTIM3µÄ¼ÆÊýÆ÷				   
   TIM3->DIER&=0xffaf;		  //¹ØTIM3ÖжÏ
   data_reset();     	      //¸´Î»ÔËÐвÎÊý
}*/

BLDC.h

#ifndef BLDC_H
#define BLDC_H
extern FlagStatus Direction;

extern void BLDC_GPIOConfig(void);
extern void BLDC_TIM1Config(void);
extern void BLDC_TIM3Config(void);
extern void huanxiang(void);
extern void BLDC_Start(void);
extern void BLDC_Stop(void);
#endif

usart.c

#include "includes.h"
/**
  *@Function		
  *@Description			
  *@Calls			
  *@Call By		
  *@Param	xxx
  *		@arg
  *		@arg
  *@Param	xxx
  *		@arg
  *		@arg
  *@Reture			
  *@Others			
  **/
void USART1_GPIOConfig(void)
{
  GPIO_InitTypeDef	GPIO_InitStruct;
  /* ÅäÖÃ USART1 Tx (PA9) */
  GPIO_InitStruct.GPIO_Pin 		= GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;	 			/* ¸´ÓÃÍÆÍìÊä³öģʽ */
  GPIO_InitStruct.GPIO_Speed 	= GPIO_Speed_50MHz;				/* Êä³ö×î´óƵÂÊΪ50MHz */
  GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  /* ÅäÖÃ USART1 Rx (PA10)  */
  GPIO_InitStruct.GPIO_Pin 		= GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_IN_FLOATING;		/* ¸¡¿ÕÊäÈëģʽ */
  GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/***************************************************
* Descirbe  :
* Input     :
* Output    :
* Attention :
* author 	:
***************************************************/
void USART1_NVICConfig(void)
{
  NVIC_InitTypeDef NVIC_InitStruct;
 	
  NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; 
  NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStruct);
}
/**
  *@Function		
  *@Description			
  *@Calls			
  *@Call By		
  *@Param	xxx
  *		@arg
  *		@arg
  *@Param	xxx
  *		@arg
  *		@arg
  *@Reture			
  *@Others			
  **/
void USART1_Config(void)
{
	USART_InitTypeDef USART_InitStruct;
	/* USART and USART2 configured as follow:
        - BaudRate = 9600 baud  
        - Word Length = 8 Bits
        - One Stop Bit
        - No parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled */
 	USART_InitStruct.USART_BaudRate            = 9600;	  					
	USART_InitStruct.USART_StopBits            = USART_StopBits_1;	 
	USART_InitStruct.USART_WordLength          = USART_WordLength_8b; 
	USART_InitStruct.USART_Parity              = USART_Parity_No;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;

	/* ÅäÖô®¿Ú1 */
	USART_Init(USART1, &USART_InitStruct);
	/* ´®¿Ú1½ÓÊÕÖжÏʹÄÜ USART_IT_RXNE : ½ÓÊÕ²»¿ÕÖÐ¶Ï */
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	/* ʹÄÜ´®¿Ú1 */
	USART_Cmd(USART1, ENABLE);
}
/**
  *@Function		
  *@Description			
  *@Calls			
  *@Call By		
  *@Param	xxx
  *		@arg
  *		@arg
  *@Param	xxx
  *		@arg
  *		@arg
  *@Reture			
  *@Others			
  **/
void USART1_SendString(char* data)
{
   unsigned char i = 0;
   for (i=0; data[i] != '\0'; i++)
   {
	  USART_SendData( USART1, data[i]);
	  while( USART_GetFlagStatus(USART1 , USART_FLAG_TXE) == RESET );
		/* ·¢ËÍÊý¾ÝÖ±µ½ USART_FLAG_TXE ·¢ËÍ¿ÕΪÕæ,¾Í¿ÉÒÔ½øÐÐÏ´η¢ËÍ */
   }
}

usart.h

#ifndef  _USART1_H
#define  _USART1_H


extern void USART1_GPIOConfig(void);
extern void USART1_Config(void);
extern void USART1_NVICConfig(void);
extern void USART1_SendString( char* data);

extern u8 ASCII_Buff[5];

#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案 的相关文章

  • ros入门(六)--imu融合里程计robot_pose_ekf扩展卡尔曼融合包

    IMU 一般具有两个基本器件 xff1a 加速计和陀螺仪 主要用于测量自身位姿 xff0c 位姿包括位置和姿态 最近在研究imu 融合里程计方面的内容 xff0c 初学一些内容 xff0c 总结一下 xff1a 环境信息 xff1a Ubu
  • ros入门(八)---TF坐标转换

    1 TF 简介 TF TransForm xff0c 就是坐标转换 xff0c 包括了位置和姿态两个方面的变换 注意区分坐标转换和坐标系转换 坐标转换是一个坐标在不同坐标系下的表示 xff0c 而坐标系转换不同坐标系的相对位姿关系 fram
  • Ros入门 (十)----激光雷达避障 简易实现

    本篇文章通过订阅 scan话题获取障碍物的距离信息 xff0c 达到避障目的 xff0c 提供部分代码 xff0c 仅供参考 1 单线激光雷达避障 xff08 1 xff09 ros接入激光雷达 以sick激光为例 xff0c 在之前的文章
  • 无人驾驶(二)---室外导航之RTK配置与接入及GPS与UTM坐标转换

    1 RTK 概述 RTK 载波相位差分技术 xff0c 是实时处理两个测量站载波相位观测量的差分方法 xff0c 将基准站采集的载波相位发给用户接收机 xff0c 进行求差解算坐标 一般包含流动站 移动站 和基准站 基站 本文中RTK定位采
  • 无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

    NoMachine for mac是一款免费的远程桌面访问工具 xff0c 这款软件的连接到远程桌面后延迟可以非常低 xff0c NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力 xff0c 打破空间和时间的障碍 xff0c 让您
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 115: illegal multibyte sequence

    在安装python相关工具的时候 xff0c 出现了gbk编码的问题 xff0c 但是改了系统编码还是不行 解决办法 xff1a 修改系统region的值 xff0c 就可以 改完之后 xff0c 重启 xff0c 完美解决
  • 视觉学习(一)--获取ZED实时图像

    最近在学习机器视觉 xff0c 主要基于ZED做一些视觉算法 xff0c 故记录下学习过程 本篇文章主要是获取ZED实时视频 xff11 环境信息 摄像头 xff1a ZED USB接口 系统 xff1a Ubuntu18 04 2 功能实
  • 视觉学习(二)---opencv函数学习

    最近在学习opencv的一些知识 xff0c 现在记录下 xff1a 1 opencv 安装 新建install opencv and contrib sh 脚本 xff0c 脚本 内容如下 xff1a VERSION TO BE INST
  • 视觉学习(三)---opencv图像处理的一般过程

    通过一些实践项目的练习 xff0c 总结下图像处理的一般过程方法 xff1a 原始图 gt 灰度图 gt 高斯滤波 xff0c 消除噪声 gt 二值图 gt 中值滤波 xff0c 消除噪声 gt 膨胀处理 gt 数据处理 xff08 如 x
  • 视觉学习(四) --- 基于yolov5进行数据集制作和模型训练

    环境信息 Jetson Xavier NX xff1a Jetpack 4 4 1 Ubuntu xff1a 18 04 CUDA 10 2 89 OpenCV 4 5 1 cuDNN xff1a 8 0 0 180 一 yolov5 项目
  • 2021年下半年信息安全工程师上午真题及答案解析

    2021年下半年信息安全工程师上午真题及答案解析 1 常见的信息安全基本属性有 机密性 完整性 可用性 抗抵赖性和可控性等 其中合法许可的用户能够及时获取网络信息或服务的特性 是指信息安全的 nbsp A 机密性 nbsp nbsp B 完
  • 2021年下半年信息安全工程师下午真题及答案解析

    2021年下半年信息安全工程师下午真题及答案解析 试题一 共20分 阅读下列说明和图 回答问题1至问题5 将解答填入答题纸的对应栏内 在某政府单位信息中心工作的李工要负责网站的设计 开发工作 为了确保部门新业务的顺利上线 李工邀请信息安全部
  • 2020年下半年信息安全工程师上午真题及答案解析

    2020年下半年信息安全工程师上午真题及答案解析 2019年10月26日 十三届全国人大常委会第十四次会议表决通过了 中华人民共和国密码法 该法律自 1 起施行 1 A 2020年10月1日 B 2020年12月1日C 2020年1月1日
  • 2020年下半年信息安全工程师下午真题及答案解析

    2020年下半年信息安全工程师下午真题及答案解析 试题一 共14分 阅读下列说明 回答问题1至问题6 将解答填入答题纸的对应栏内 说明 Linux系统通常将用户名相关信息存放在 etc passwd文件中 假如有 etc passwd文件的
  • H3C交换机常用命令大全

    一 用户配置 system view H3C super password H3C 设置用户分级密码 H3C undo super password 删除用户分级密码 H3C localuser bigheap 123456 1 Web网管
  • H3C交换机设置时间命令

    H3C交换机设置时间命令 1 用户视图 xff0c 查询交换机系统时间 lt h3c gt display clock 2 用户视图 xff0c 调整交换机系统时间 lt h3c gt clock datetime at 12 00 00
  • pycharm 五种实用的插件

    相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的 今天我来分享几个好用且酷炫的Pycharm插件 xff0c 在安装上之后 xff0c 你的编程效率 工作效率都能够得到极大地提升 1 Rainbow csv
  • MYSQL数据库自动备份

    1 创建备份脚本 xff1b 将以下代码复制到文本文件中 xff0c 另存文件文件名 txt xff0c 改为 bat 64 echo off start 以时间为维度作为备份文件名的后缀 set dt 61 time 0 2 if dt
  • MySQL定时备份数据库(全库备份)

    一 MySQL数据备份 1 1 mysqldump命令备份数据 在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump 我们可以通过命令行直接实现数据库内容的导出dump 首先我们简单了解一下mysqldump命
  • H3C交换机SSH配置

    H3C交换机SSH配置 1 使用SSH 43 密码认证 基本SSH配置方法 注 xff1a 在用户使用SSH登录交换机时 xff0c 交换机对所要登录的用户使用密码对其进行身份验证 生成RSA和DSA密钥对 H3C public key l

随机推荐

  • 2022年下半年网络规划设计师考试论文真题

    试题 一 论5G与校园网络融合的规划与设计 近年来 xff0c 教育部等部门印发了 教育信息化2 0行动计划 关于推进教育新型基础设施建 设构建高质量教育支撑体系的指导意见 等文件 xff0c 引导高等学校以信息化为主导 xff0c 面向高
  • 2022年下半年网络规划设计师考试下午真题

    试题一 案例一 某单位网站受到攻击 首页被非法篡改 经安全专业机构调查 该网站有一个两年前被人非法上传的后门程序 本次攻击就是因为其他攻击者发现该后门程序并利用其实施非法篡改 nbsp 案例二 网站管理员某天打开本单位门户网站首页后 发现自
  • 2022年信息安全工程师上午真题及答案解析

    2022年信息安全工程师上午真题及答案解析 1 中华人民共和国网络安全法 第五十八条明确规定 因维护安全和社会公共秩序 处置重大突发社会安全事件的需要 经 nbsp 决定或者批准 可以在特定区域对网络通信采取限制等临时措施 A 国务院 B
  • 2022年信息安全工程师下午真题及答案解析

    2022年信息安全工程师下午真题及答案解析 阅读下列说明 xff0c 回答问题1至问题3 将解答填入答题纸的对应栏内 说明 访问控制是保障信息系统安全的主要策略之一 xff0c 其主要任务是保证系统资源不被非法使用和非常规访问 访问控制规定
  • 华为交换机Console密码重置、设备初始化、默认密码

    1 华为交换机Console密码重置 1 通过Console口连接交换机 xff0c 并重启交换机 2 当界面出现以下打印信息时 xff0c 及时按下快捷键 Ctrl 43 B 并输入BootROM BootLoad密码 xff0c 进入B
  • 华为S7700交换机如何清除console密码

    问题描述 s7700设备如何清除console密码 解决方案 S7703设备清除console密码过程 重新启动设备 xff08 设备单主控启动 xff0c 双主控请拔下一张主控卡 xff09 当设备上电后 xff0c 操作终端屏幕上显示如
  • 华为交换机配置ssh登录远程管理交换机

    配置华为交换机ssh远程登录 xff0c 先配置交换机的管理地址和vlan xff0c 此处为vlan10 xff0c 把接口GE0 0 1划入vlan10 xff0c 管理地址为192 168 10 100 241 创建本地密钥对 配置接
  • Oracle用户被解锁解决方案(1)

    xfeff xfeff 查看被锁的用户 select LOCK DATE username from dba users where username 61 39 USERNAME 39 LOCK DATE为空说明没有锁定 xff0c 非空
  • 华为S5700交换机初始化和配置telnet,ssh用户方法

    华为S5700交换机初始化和配置telnet xff0c ssh用户方法 通过串口线配置S5700 的管理IP地址和网关 xff0c 串口线接在交换机的console口 xff0c ip设置完成后网线接在ETH口 xff1a lt Quid
  • 华为交换机恢复出厂设置

    华为交换机恢复出厂设置 方法一 xff1a 已知用户名和密码场景 lt SW gt reset saved configuration Warning The action will delete the saved configurati
  • 常用网络工具5:网络抓包工具wireshark

    Wireshark xff08 前称Ethereal xff09 是一个网络数据包分析软件 网络数据包分析软件的功能是截取网络数据包 xff0c 并尽可能显示出最为详细的网络数据包数据 Wireshark使用WinPCAP作为接口 xff0
  • OpenHarmony 3.0 虚拟机开发环境

    本文介绍一种简单的OpenHarmony环境搭建方法 首先我们要知道环境搭建包括哪些内容 xff0c 这样我们才好知道如何去搭建 通常来说 xff0c 环境搭建包括这3大部分 xff1a 代码编写 代码编译 代码下载 烧录程序 在OpenH
  • 程序员如何更好的提升自己

    首先你得明白 xff0c 一个人的能力就像一个池塘 xff0c 不断的输入又不断地输出 xff0c 水池的容量以及水的质量决定了输出的高效与否 xff0c 输入大于输出 xff0c 你的池塘就会不断扩大 xff0c 换句话说你会的技能就越来
  • error:D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题解决

    VS调试中出现上述问题 进入 项目 gt 属性 gt C C 43 43 xff08 1 xff09 gt 常规 gt 调试信息格式 gt 选择 程序数据库 Zi 或 无 xff08 2 xff09 gt 代码生成 gt 启用函数集链接 g
  • Linux驱动程序开发用户态和内核态 模块机制

    Linux驱动程序开发 用户态和内核态 Linux操作系统分为用户态和内核态 用户态处理上层的软件工作 内核态用来管理用户态的程序 xff0c 完成用户态请求的工作 驱动程序与底层的硬件交互 xff0c 所以工作在内核态 Linux操作系统
  • QT学习第一步 QT下载及安装详细步骤

    下载地址 xff1a QT官方网站 QT下载安装地址 选择的这个 xff1a QT下载安装地址 文件名称选择 xff0c 图中红色箭头详解 xff1a 选择archive QT开发工具安装包文件夹 xff1a 进入之后显示的文件夹 xff1
  • RT-Thread临界段的保护

    临界段的保护 什么是临界段 临界段 xff0c 用一句话概括就是一段在执行时不能被中断的代码段 在RT Thread中 xff0c 临界段最常出现的场景就是对全局变量的操作 xff0c 全局变量就好像是一个靶子 xff0c 谁都可以对其开枪
  • Oracle中expdp与impdp--导入和导出操作步骤

    Oracle expdp 与impdp 一 根据用户导出导入数据 用户和表空间都相同 这些命令必须在Oracle 工具执行 create directory dpdata1 as E oracle home product backup 这
  • 编写Linux设备驱动程序的注意事项

    编写设备驱动程序的注意事项 应用程序开发与驱动程序开发的差异 在Linux上的程序开发一般分为两种 xff0c 一种是内核及驱动程序开发 xff0c 另一种是应用程序开发 这两种开发种类对应Linux的两种状态 xff0c 分别是内核态和用
  • 单片机STM32F103RB,BLDC直流电机控制器设计,原理图、源码和电路方案

    基于STM32 BLDC直流无刷电机控制器设计 xff0c 并附上原理图和源码等 源代码是基于免费开源CoOS UCOS类似 操作系统上写的 xff0c 在学习无刷电机的控制同时还能学习到操作系统的知识 同时提供用Matlab的GUI编写的