【电机控制】FOC算法验证步骤
文章目录
前言
【电机控制】直流有刷电机、无刷电机汇总——持续更新
使用工具:
1.示波器:PICO7
提示:以下是本篇文章正文内容,下面案例可供参考
一、PWM——不接电机
载波频率12.5K
#define PWM_Fre 12.5 #define PWM_Perload 72000/(uint32_t)(PWM_Fre*2) //2880
分别让寄存器上桥发波50%,25%,0%,下桥互补输出,50%,75%,100%
CMPA = 1440; //(0.5+1)*2880/2 CMPB = 720; CMPC = 0;
将寄存器的值串口打印至上位机
同时在仿真器显示
采样点,控制芯片引脚输出至预驱芯片引脚,本次实验采的是驱动器引脚,直接采集控制芯片引脚也可以
1、PWMA-H-50%
2、PWMB-H-25%
3、PWMC-H-0%
4、PWMA-L-50%
5、PWMB-L-75%
6、PWMC-L-100%
7、PWM频率与占空比计算方式——载波周期
ARR(TIM_Period) 是计数值;
PSC(TIM_Prescaler) 是预分频值。
计算公式:F_PWM = 主频 / ((ARR+1)*(PSC+1))(单位:Hz)
Timerbasetypdf.TIM_Prescaler = 0;//72M Timerbasetypdf.TIM_Period = PWM_Perload;//12.5kµÄƵÂÊ
#define PWM_Perload 72000/(uint32_t)(PWM_Fre*2) // #define PWM_Fre 6//12.5
而定时器配置为向上-向下计数模式,所以实际的计数周期是2 * PWM_Perload
Timerbasetypdf.TIM_CounterMode = TIM_CounterMode_CenterAligned1;//
F_PWM = 主频/ (2 * (ARR+1)*(PSC+1))(单位:Hz)
F_PWM =72M/2/2880=6k
二、ADC——不接电机
1.电流零点稳定性、ADC读取的OFFSET
串口打印出AD采样寄存器的值,看是否稳定
printf("%.4d,%.4d,%.4d\n", ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1),ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2),ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3));
打印结果
U相V相约有450个ADC值,W相约有1500个ADC值OFFSET
2.电流钳准备
直流稳压电源输出0.6A
电流钳抓到0.6A左右
3.运放电路分析
1.电路OFFSET
程序上读取offset值的时候是在初始化阶段,电机处于停止状态,此时的相电流等于0。
(VM_IA -V6)/R28=(V6-VGND)/R36
VM_IA=3×V6
V5=VA×R42/(R41+R42)+VREF×R41/(R41+R42)=0.91VA+0.159
由虚短可得,V5=V6
VM_IA=2.73VA+0.477<=3.3V
下桥几乎没有电流通过时,不带电机测试时,可以测得为0.48V
2.AOP
AOP=Vout/Vin=VM_IA/VA=2.73
3.采样电路的采样值范围
2.73VA+0.477<=3.3V
VA<=1.03V,Rshout=0.05Ω
IA=VA/Rshout<=20.6A
相电流最大采集20A
4.相电流与ADC采样值的关系
我们需要计算相电流与ADC采样值的关系,也就是说,通过ADC采样的值,经过数学公式计算,可以计算出来当前相电流为多少,再根据相电流进行FOC变换
IA=7.3×VM_IA-3.5=7.3×VM_IA×3.3/4096-3.5-offset
此时VM_IA为ADC采样值,通过单片机引脚接入
电流=(ADC原始值/4096∗3.3-offset)/采样电阻阻值/运放放大倍数
相电流=(offset-ADC原始值)/4096∗3.3/采样电阻阻值/运放放大倍数
采样电阻阻值= 0.05
运放放大倍数=2.73
相电流=(offset-ADC原始值)/ 0.006
printf("%.4f,%.4f,%.4f\n",(AdcValue.PhaseUCurrOffset-ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1))*0.006,(AdcValue.PhaseVCurrOffset-ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1))*0.006,(AdcValue.PhaseWCurrOffset-ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1))*0.006);
5.V相电流
4.电流极性判断——接电机
CMPA = 1440; //50% CMPB = 288; //10% CMPC = 288; //10%
5.ADC采样时间计算
配置的STM32的系统时钟频率,例如:72MHZ。
设置的ADC分频因子,例如:RCC_PCLK2_Div6,即6分频。
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
设置的ADC采样时间,例如:ADC_SampleTime_13Cycles5, 即13.5个周期。
ADC_InjectedChannelConfig(ADC1,ADC_Channel_5,1,ADC_SampleTime_13Cycles5); ADC_InjectedChannelConfig(ADC1,ADC_Channel_6,2,ADC_SampleTime_13Cycles5); ADC_InjectedChannelConfig(ADC1,ADC_Channel_7,3,ADC_SampleTime_13Cycles5);
以系统时钟频率为72MHZ,ADC分频因子为RCC_PCLK2_Div6, ADC的采样时间为ADC_SampleTime_13Cycles5,进行计算
ADCCLK(ADC的时钟频率 ) = 72MHZ(系统时钟频率) / 6 (ADC分频因子) = 12MHZ。
一个ADC周期占用的时间 = 1 / 时钟频率 = 1 / 12MHZ = 0.0833334 uS
计算ADCCLK为12MHZ时的最大采样间隔时间 =13.5周期 + 12.5周期 = 26周期 = 2.08uS
三、参考文献
运放-同相放大与反相放大
foc学习笔记3——电流环
关于FOC相电流采样电路参数的分析
FOC(电机矢量控制)调试记录
STM32之ADC
STM32 ADC 采样时间计算与误差处理
总结
本文仅仅简单介绍了【电机控制】FOC算法验证步骤,评论区欢迎讨论。