Bootstrap

【FOC】FOC开发遇到的Bug

引言:本文主要介绍从硬件到软件实现上所遇到的所有bug

目录

1.硬件

1.1晶振

1.2运放电路

1.3 ADC读取异常

2.软件

2.1芯片启动模式

2.2电角度对齐

2.3电机发抖是什么原因?

2.4 SVPWM过调制



1.硬件

1.1晶振

        硬件同事,随便拿了个晶振焊上了,导致与原理图不匹配,软件按原理图配置,使系统时钟错误,程序跑飞

1.2运放电路

        

(1)运算放大系数怎么算

        这个电路是差分运放电路电路,根据虚短、虚断可以计算出其放大系数,这里不再解释直接上课件。

        两图对照,ui1 = 0,ui2 = U_CURRENT, R1 = 1K, R2 = 10K , R3 = 4.7K , RF = 100K, u0 = ADC_U  ,则 u0 = 32.29 * ui2 , 即ADC_U = 32.29 * U_CURRENT

(2)怎么反应到三相电流上

        ADC分辨率为12位,芯片的参考电源VDDA为3.3V,则ADC的数值1代表3.3/2^12

         ADC_U = ADC读到的值* 3.3/2^12 = 32.29 * U_CURRENT

        流过R29的电流 = (U_CURRENT - 0)/(0.7*10^-3) = (ADC读到的值 * 3.3 / 2^12 / 32.29) /(0.7 * 10^13) = 0.03564412 * ADC读到的值

(3)运算放大系数怎么选

        准则:ADC能读取的信号是0~3.3V,所以保证放大后的信号在3.3V内就行

        计算过程就是上个问题的逆向推算,先估计一下你电机的相电流是多少,比如我电机的线电流(正常电机都标功率和线电压) = 30A ,而电机一般是星型连接(三角连接一般是三相异步电机),则有效相电流 = 30 / 根号2 = 21.21A,峰值相电流 = 30 * 根号2 = 42.43A,用这个峰值相电流逆推运算放大系数

(4)为什么要加+1.65V电压

        三相电流是0对称的信号,而ADC只能接受0~3.3V信号,所以没有偏执电压就无法接受到三相电流的负电压信号,而提供1.65V的偏执电源,则三相电流变成了1.65V的对称信号,ADC能完全接收到了。

(5)放大系数反应到ADC上为什么信号不准确

        神奇的模电,当温度升高时,阻值变化、放大器也变化,具体我也不太懂,希望评论区的大神能够解释一下。

1.3 ADC读取异常

        在标定三相电流时,第三项电流每次硬件自校验都会错误,出现错误的偏移量和增益比例,并且ADC采样必须自校验后采样20多次ADC才能稳定下来,我和硬件同事的讨论结果是芯片是假货,在立创商城里买后焊接上,BUG修改成功

2.软件

2.1芯片启动模式

问题一:刷写程序后,程序直接跑飞,进入debug模式后,程序不进入main函数,断点不起作用,也找不到程序执行到哪里。

问题分析:I2C的SDA引脚占用了STM32G4的Boot0引脚,导致在复位时,SDA一直输出高电平,在SYSCLK的第四个上升沿,Boot0引脚锁存为1,系统存储器启动,未能正常运行

引脚/字节设置启动模式说明
BOOT0 = 0主Flash启动执行用户程序。
BOOT0 = 1系统存储器启动固件烧录,需重新上电用flash启动才起作用
nBOOT0 = 1, nBOOT1 = 0SRAM启动在内存里执行用户代码,进行调试

        释放SDA这一IO口,接飞线到GND,实现主Flash启动

序号执行动作说明
1初始化MSP从向量表的第一项加载主栈指针 (MSP)
2初始化PC
3设置堆栈大小变量、函数、动态内存等
4跳转Reset_Handler包含初始化流程、跳转到用户代码的复位处理程序
5

初始化中断向量表

6调用初始化函数系统时钟配置、系统配置寄存器初始化、初始化数据段和堆栈段
7调用_main运行用户编写的main函数

2.2电角度对齐

        电角度对齐的方式包括三类:1.hall霍尔传感器        2.编码器        3.无感算法

        我用的是编码器,而编码器又分为 1.绝对值编码器        2.增量编码器        3.旋转编码器

        其绝对值编码器的接口一般是I2C、ADC、SPI,其中ADC使用最为简单、读取速度最快,但其准确性、稳定性最差,因为3.3V内随便一个噪声都会使电压变化,再反应到电角度更为明显,所以稳定准确性差,会导致电机抖动;I2C记得一定要用DMA模式、复用的GPIO为快速模式、波特率要干到1000K就OK;SPI我没使用过。以上全为板间通讯,不适合长距离使用

        增量编码器一般是ABZ接口,是我目前使用体验较舒服的接口,A、B相配置时钟为Encoder模式,Z相配置为GPIO中断模式就OK

        旋转编码器未使用过

        电角度一直对不齐,总结下来是初始时,FOC给三相的占空比不对,三相磁场合成后不指向0点,还有一点是对齐时用的电流较大,使电机在对齐点出震荡,一直不停下来对齐。最后,给FOC角度=3*π/2(平均值SVPWM)或 0(其他SVPWM),电流给0.5A,成功对齐电角度。

  那增量式编码器怎么电角度对齐呢?

       1. 给FOC的值一般是电角度、id、iq值,只需要给电角度 = 0,id = 0,iq = 0.01(一定要小,减小对齐时的震荡),然后大概0.5s后转子磁场就会与虚轴Y对齐,定子磁场就会与实轴X对齐,这时初始化编码器角度为0就OK

        2.但这时我们只知道了电角度的0点,怎么知道机械角度的0点呢,这时就需要让电机转起来,触发Z相中断信号,然后在回调里记录上编码器的值,记为偏移量amend_Theta,再初始化编码器的值为0,那电角度计算为 = (机械角度 + amend_Theta)/极对数,再对2π取余

2.3电机发抖是什么原因?

1.电机启动时,电角度0°没完全对齐,电机转到高速,转着转着会咯噔咯噔的

2.电流环、速度环、位置环的PID参数没有调好,导致被控制量跟不上,误差逐渐拉大,积分器不断累计,也就突然咯噔一下

2.4 SVPWM过调制

        由于改变母线电压,从24V变为12V,PID输出的限值范围过大,导致输出的电压超过12/\sqrt{3},SVPWM过调制,反应到三相占空比上就是,FOC计算出的ccr值超过arr值,占空比为100%,一个FOC周期内,某一相一直是上管导通而下管不导通,采样电阻没有电流通过,所以三相电流的这一相采样失效不可用。

        解决办法1.保证SVPWM工作在线性区,限值PID的输出,在\left [ U_{dc}/\sqrt{3},- U_{dc}/\sqrt{3}\right ] * 0.9

2.软件上,先设计电流重构算法,重构失效的三相电流为有效的电流,再设计过调制控制算法,如:最小相位误差过调制、最小幅值误差过调制策略。3.硬件上,将采样电阻放在三相线上,但缺点是发热严重。

        综上:为实现大扭矩控制,充分利用逆变器的容量,采用软件策略,电流重构+过调制策略


文章会不断更新我遇到的BUG,感谢指正错误

;