|
梁工你好,我现正在学习你发布的三相无刷电机驱动-STC32G-无HALL-Ver3程序,有以下几个问题不明白,向你请教一下。 一、看程序的几种预定位时间设置,小电机在100ms左右,大一点的电机在几百ms,预定位的作用是什么呢?是要先让电机转起来达到多少转吗?
二、在PWM中断里面的ROLL_CHECK转动检测程序部分,有以下几个问题:
- else if(run_mode == STARTING) //启动模式, 使用查表S曲线加速启动
- {
- if(++fs_cnt == 4) // 使用256点的S曲线表,初速V1(<font color="#ff0000">转/分</font>),终速V2(转/分),加速时间t(ms),fs=24000000/1024/4 = 46875 /8 = 5859Hz,则加速总步数StartTime = t/1000*fs = t*1000/(1024*4/24) = t*375/64=t*6步
- { // 查表步进 = 65536/StartTime, 步数SartCnt每次+1,查表得到速度系数 du=S_Curve[SartCnt*65536/StartTime/256] = S_Curve[SartCnt*256/StartTime], 当前速度 V = V1 + (V2-V1)*du/1024 (转/秒)
- fs_cnt = 0; // 采样频率fs,16位累加器roll_sum,磁极对MPP,则电机转速 V=60*fs*roll_N/roll_sum/MPP, 转速步进 roll_N = V*MPP*sum/60/fs = V*MPP*65536/60/5859 = 0.1864*V*MPP = V*MPP*191/1024
-
- SartCnt++;
- if(SartCnt < StartTime)
- {
- roll_N = BeginSpeed + (u16)(((u32)S_Curve[(u8)((u32)SartCnt*256/StartTime)] *(FinishSpeed - BeginSpeed))/1024); //当前速度 V = V1 + (V2-V1)*du/1024 = V1 + (V2-V1)*S_Curve[SartCnt*256/StartTime]/1024 (<font color="#ff0000">转/秒</font>)
- roll_sum += (u16)(((u32)roll_N*MPP*191) >>10); // 当前速度 = V*MPP*191/1024
-
- angle = (roll_sum >> 4); //roll_sum是16位的,SVPWM表长度为12位
- LoadPwm();
- }
复制代码
1、这里的V1、V2和V,单位为什么有转/分、转/秒呢? 2、关于速度系数du,我是这么想的,总长度是256点,总步数是StartTime,那么查表步进就是256/StartTime,du=S_CURVE[SartCnt*256/StartTime,不知道这样理解是否正确,请问你程序中的注释查表步进=65536/StartTime是怎样理解的呢? 3、电机转速 V=60*fs*roll_N/roll_sum/MPP, 转速步进 roll_N = V*MPP*sum/60/fs = V*MPP*65536/60/5859 = 0.1864*V*MPP = V*MPP*191/1024
这里应该怎样理解呢?因为我看后面roll_N = BeginSpeed + (u16)(((u32)S_Curve[(u8)((u32)SartCnt*256/StartTime)] *(FinishSpeed - BeginSpeed))/1024)这里是计算转速,而不是步进。 4、对于roll_sum += (u16)(((u32)roll_N*MPP*191) >>10); //当前速度 = V*MPP*191/1024 angle = (roll_sum >> 4) 为什么roll_sum的累加值就是当前电角度angle呢?
谢谢!
|