FOC基础源码分析

以基于STM32F103的FOC源码为例分析; 保存电机参数 采用宏定义开关来决定是否要进行参数校准; //1 已校准 //0 未校准 #define IS_ALIGN 0 //参数数据结构体 struct ALIGN_DATA { long direction; int pole; float zero_angle; } DATA_ALIGN; //根据宏定义判断是否要更新FLASH中存储的参数 #if IS_ALIGN Internal_ReadFlash(ALIGN_ANGLE_ADDR, (uint32_t *)&DATA_ALIGN, 3);//读取内部FLASH中的参数 sensor_direction = DATA_ALIGN.direction; //方向 pole_pairs = DATA_ALIGN.pole; //极对数 zero_electric_angle = DATA_ALIGN.zero_angle;//零点角度 #else // //此处略去参数识别代码 // DATA_ALIGN.direction = sensor_direction; //方向 DATA_ALIGN.pole = pole_pairs; //极对数 DATA_ALIGN.zero_angle = zero_electric_angle;//零点角度 Internal_WriteFlash(ALIGN_ANGLE_ADDR, (uint32_t *)&DATA_ALIGN, 3);//将参数写入单片机内部FLASH中 通过UART通信控制电机 /** * @brief 简易串口命令接收,需在while循环里重复调用该函数 * @return 无 */ void commander_run(void) { if ((USART_RX_STA & 0x8000) != 0) { switch (USART_RX_BUF[0]) { case 'H': printf("Hello World!\r\n"); break; case 'T': // T6.28 target = atof((const char *)(USART_RX_BUF + 1)); printf("RX=%.4f\r\n", target); break; case 'D': // D M1_Disable; printf("OK!\r\n"); break; case 'E': // E M1_Enable; printf("OK!\r\n"); break; } USART_RX_STA = 0; } } #define USART_REC_LEN 256 unsigned char USART_RX_BUF[USART_REC_LEN]; //接收缓冲,usart.h中定义长度 //接收状态 // bit15 接收完成标志 // bit14 接收到0x0D // bit13~0 接收的字节数 unsigned short USART_RX_STA = 0; //接收状态标志 //发送的命令必须以"\r\n"作为结尾,以标志命令的结束 void USART1_IRQHandler(void) //串口1中断程序 { unsigned char Res; if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // { Res = USART_ReceiveData(USART1); //读取接收到的字节 if ((USART_RX_STA & 0x8000) == 0) //接收未完成 { if (USART_RX_STA & 0x4000) //接收到了0x0d { if (Res != 0x0a) { USART_RX_STA = 0; //接收错误,重新开始 } else { USART_RX_STA |= 0x8000; //接收完成 USART_RX_BUF[USART_RX_STA & 0X3FFF] = '\0'; //最后一个字节放'0’,方便判断 } } else //还没收到0x0D { if (Res == 0x0d) { USART_RX_STA |= 0x4000; } else { USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res; USART_RX_STA++; if (USART_RX_STA > (USART_REC_LEN - 1)) { USART_RX_STA = 0; //接收错误,重新开始 } } } } } }

November 21, 2022 · 2 min · Rancho

FOC项目记录

大四应该没多少事情了,想继续做一下FOC相关的; 开发过程(持续更新): 2022年9月29日: 中间好久没有更新,是这几天比较忙,没有时间写; 算下来,FOC的板子做了三个大的版本,五个比较小的版本,可以说是一次次的迭代更新; 主控 供电方案 驱动模块 是否有电流采样 通信方式 FOC-V1 STM32F103C6T6 AMS1117-3.3V DRV8313 否 UART FOC-V2 STM32F103C6T6 AMS1117-3.3V DRV8313 否 UART FOC-V3 STM32F103C6T6 AMS1117-3.3V MP6540 是 UART FOC-V4 AT32F403ACGU7 AMS1117-5V & AMS117-3.3V DRV8313 否 UART FOC-V5 STM32F405RGT6 L7805 & AMS1117-3.3V BTN7960B 是 UART/CAN 代码自己也加入了很多功能,电流环还没有做出来,后边再继续努力做,加油! 板子PCB: 版本 图片 FOC-V1 FOC-V2 FOC-V3 FOC-V4 FOC-V5 2022年9月12日: 中间好久不更新,这些天对FOC项目做了更多的测试,还有做了一些应用,例如倒立摆,平衡车等等; 想要加上电流环,刚开始自然的想法是,用合金采样电阻加电流放大器加stm32的AD,这个外围电路比较麻烦,成本也很高; 昨天查找资料发现了一个芯片:MP6540,三相电机驱动芯片,且内部集成了电流检测,只需要用32的AD去读就可以了,今上午画了一个测试板,已经发去打样了,希望能正常工作; 等板子回来了,我测试一下,在说要不要改用这个芯片; 2022年9月3日: 修改的板子今天已经到了,焊接好了,也测试了,很完美,发热没那么严重了; 这次使用的LDO是AMS1117(SOT-89封装),它的输入最高电压是18V,完全够用了,发热虽然还是很大,但封装也更大了,所以还是可以接受的; AMS1117数据手册说明的的输入电压限制 在测试过程中,长时间运转未出现任何问题,闭环控制,开环控制都可以很好运转; 后续就是开始做平衡车,调参数; 2022年8月22日: 今天又查看了一下RT9013-33GB的数据手册,发现电压最大为5.5V,看来是要换供电部分的电路了; 输入电压限制 输出电流限制 ...

September 29, 2022 · 1 min · Rancho