无刷电机开环控制(GPIO版简单代码)

通过IO口简单模拟6步换相法,不涉及数学模型。

修改下面3个参数可改变电流和速度

比较菜,大佬勿喷。此代码仅测试使用,实际使用请参考Simple FOC等

void my_delay(uint16_t tick)
{
  uint16_t i;
  if(tick>0)
    for(i=tick;i>0;i--)
    {
      __NOP();
    }
}

void ALL_L(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_RESET);
}
void ALL_H(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_SET);
}

void AH_BCL(void)
{
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_SET);
}
void BH_ACL(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_SET);
}
void CH_ABL(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_SET);
}


void AL_BCH(void)
{
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_RESET);
}
void BL_ACH(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_RESET);
}
void CL_ABH(void)
{
    HAL_GPIO_WritePin(MOTOR_A_GPIO_Port, MOTOR_A_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_B_GPIO_Port, MOTOR_B_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(MOTOR_C_GPIO_Port, MOTOR_C_Pin, GPIO_PIN_RESET);
}

uint8_t TurnTick=10,Nest_TurnTick=10;
uint8_t TurnTimes=30,Nest_TurnTimes=30;

uint8_t EmptyMul= 4,Nest_EmptyMul=4;


void Change_Function(void(*Function_A)(),void(*Function_B)())
{
    uint16_t i,j;

  for(i=TurnTick;i>0;i--)
  {
    for(j=TurnTimes;j>0;j--)
  {
    Function_B();
    my_delay(i);
    ALL_H();
    //HAL_Delay(i*EmptyMul);
    my_delay(i*EmptyMul);
    Function_A();
    my_delay(TurnTick-i);
    ALL_H();
    //HAL_Delay((TurnTick-i)*EmptyMul);
    my_delay((TurnTick-i)*EmptyMul);
  }
  }  
}

struct mUSART_t com1={0};
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)        //È·ÈÏ´®¿ÚΪUSART1
    {
      if(com1.losttimes)
      {
        com1.RX_data[com1.RX_count++]=com1.RX_Byte[0];
      }
      else
      {
        memset(com1.RX_data,0,24);
        com1.RX_count=0;
        com1.RX_data[com1.RX_count++] = com1.RX_Byte[0];
      }
      com1.losttimes=200;        

      HAL_UART_Receive_IT(&huart1,com1.RX_Byte,1);    //ÔÙ´ÎÆôÓýÓÊÕ
    }

}


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
//unsigned char str[]={"hello world"};//???????

  /* USER CODE BEGIN 1 */
//  uint16_t i,j;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

//HAL_UART_Transmit(&huart1,str,sizeof(str),100);//??????
  HAL_UART_Receive_IT(&huart1,com1.RX_Byte,1);
  ALL_H();
  while (1)
  {
    if(TurnTick!=Nest_TurnTick)
      TurnTick>Nest_TurnTick ? TurnTick--:TurnTick++;
    
    if(TurnTimes!=Nest_TurnTimes)
      TurnTimes>Nest_TurnTimes ? TurnTimes--:TurnTimes++;
    
    if(EmptyMul!=Nest_EmptyMul)
      EmptyMul>Nest_EmptyMul ? EmptyMul--:EmptyMul++;
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
    
    AL_BCH();
    Change_Function(AL_BCH,CH_ABL);
    
    CH_ABL();
    Change_Function(CH_ABL,BL_ACH);
    
    BL_ACH();
    Change_Function(BL_ACH,AH_BCL);
    HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

    
    AH_BCL();
    Change_Function(AH_BCL,CL_ABH);
    
    CL_ABH();
    Change_Function(CL_ABH,BH_ACL);
    BH_ACL();
    Change_Function(BH_ACL,AL_BCH);
    
    if(com1.RX_Flag==1)
    {
      switch (com1.RX_data[0])
      {
          case 'c': 
          Nest_TurnTick=atoi((const char *)&com1.RX_data[1]);
          HAL_UART_Transmit_IT(&huart1,(const uint8_t *)"OK",sizeof("OK"));
              break;
          case 's': 
          Nest_TurnTimes=atoi((const char *)&com1.RX_data[1]);
          HAL_UART_Transmit_IT(&huart1,(const uint8_t *)"OK",sizeof("OK"));
              break;
          case 'e': 
          Nest_EmptyMul=atoi((const char *)&com1.RX_data[1]);
          HAL_UART_Transmit_IT(&huart1,(const uint8_t *)"OK",sizeof("OK"));
              break;
        
          default:
              break;
      }
      com1.RX_Flag=0;
    }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值