基于STM32G431无刷电机驱动FOC软硬件学习
开源地址:【开拓者】STM32G431无刷电机驱动
介绍
STM32G431无刷电机驱动,已验证使用大疆小精灵2312s电机,实现电流速度位置闭环
磁编mt6816,spi通信
硬件
供电最大电压受限于母线电容耐压、MOS官耐压、DCDC耐压。
最高40V。
LEDPB8PB9KEYPC10 ------> KEY1PC11 ------> KEY2ADC1C相电流 PA2 ------> ADC1_IN3(注入组) A相电流 PB1 ------> ADC1_IN12(注入组)电位器 PB12 ------> ADC1_IN11(规则组)ADC2母线电压 PA0 ------> ADC2_IN1(规则组)B相电流 PA6 ------> ADC2_IN3(注入组)TIM1PB13 ------> TIM1_CH1NPB14 ------> TIM1_CH2NPB15 ------> TIM1_CH3NPA8 ------> TIM1_CH1PA9 ------> TIM1_CH2PA10 ------> TIM1_CH3USART3(开启了发送DMA,用于向VOFA上位机阀数据,波特率921600)PB10 ------> USART3_TXPB11 ------> USART3_RXSPI1(磁编码器MT6816)PA4 ------> SPI1_CSPB3 ------> SPI1_SCKPB4 ------> SPI1_MISOPB5 ------> SPI1_MOSI
软件
main函数
main函数,初始化外设,随后进入while循环,一直读母线电压、串口向上位机发送数据
进入while前打开定时器1通道4计数,其更新事件会触发ADC的注入组采样,注入组采样完成会触发中断,然后在中断中获取相电流、做FOC运算、赋值结果给PWM输出。
定时器1通道4频率为10K,ADC的注入组采样频率也是10K,foc的计算频率也是10K。
系统时钟
使用外部晶振24MHz,系统频率160MHz。(实际电路用的25MHz,后面当成24MHz来说)
定时器1初始化
SVPWM的PWM波形是对称的:
正好配置TIM1为中央对齐模式1,在上面代码的配置中,系统主频160MHz,TIM_Period(ARR)=8000,假如CH1的TIM_Pulse(CCR)=800。采用的PWM1模式,即CNT小于CCR时,输出有效电平,大于CCR小于ARR时,输出无效电平,又配置CHx的有效电平为高电平,CHxN的有效电平为高电平,则可以得到下面的PWM波形:
PWM的频率=160M/8000/2=10KHz
把通道4初始化为PWM2模式,其更新事件用来触发ADC注入组采样。
ADC初始化
ADC1C相电流 PA2 ------> ADC1_IN3(注入组) A相电流 PB1 ------> ADC1_IN12(注入组)电位器 PB12 ------> ADC1_IN11(规则组)ADC2母线电压 PA0 ------> ADC2_IN1(规则组)B相电流 PA6 ------> ADC2_IN3(注入组)
规则组采样由软件触发,注入组采样由定时器1通道4的更新事件来触发。
按键
按键用外部中断检测,按键2电机加速,按键1电机启停。
串口接收
串口接收中断
ADC注入组中断
ADC注入组中断,频率10k
红框中是电机0电流值采集,后面才是电机正常运行时的程序。采集相电流做foc运算。
获取到3相电流值,然后执行Speedcurrentclosed_loop,做速度环foc。