通过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 */
}