找回密码
 立即注册
查看: 360|回复: 12

关于"STC-FOC"之我的猜想

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-12-16 10:58:38
已绑定手机

1

主题

43

回帖

171

积分

注册会员

积分
171
发表于 2025-12-8 10:03:48 | 显示全部楼层 |阅读模式
参考帖子:

  “最便宜的 车规-FOC,24万转@STC32G12K128-24A车规,STC-FOC 新算法库,11/30更新”
        https://www.stcaimcu.com/thread-19545-1-1.html
最初见到这个电路时,对于只使用4只电阻的过零检测感觉很神奇,但是核心代码是LIB库,
用起来多少会有点不方便,所以想要研究一下原理;
经示波器测试,相线之间的电压波形确实是正弦波,但线电流(以及总线电流)却有周期性的“断点”,
所以猜想其原理就是在UV相的交叉点附近关闭6只MOS管,通过比较器检测“过零”;
基于这种猜想,自己写代码验证了一下,确实可行;只是目前的代码还比较粗糙。
申明:
本程序仅用于研究学习,功能尚未完善,可能有BUG。
此程序仅在1806(KV2280)电机上试过,供电电压5V。
本程序根据帖子中的附件“STC_FAN_FOC库-2025年11月30日 16点46分”修改而来,未使用“STC_FAN_FOC.LIB”库。
产生三相SPWM,在固定相位区间关闭PWM(关断6只MOS管,令三相悬空)便于检测反电势过零点
(U、V相的交叉点,约位于电周期的150度),调节速度mot_speed使过零点的相位达到设定值。
当前配置:
PWM为边沿对齐模式;
PWM频率约23kHz;
PWM占空比最大255,便于用1字节来控制;
SPWM采用查表方式,周期为256;

源代码: FOC-lcw.rar (57.3 KB, 下载次数: 14)

过零检测时机:
傲游截图20251208094245.jpg
参考原理图:“SCH-STC-FOC-24万转-小功率-V1.6-20250910.pdf”
傲游截图20251208094733.jpg
运行环境:
傲游截图20251208101236.jpg

部分核心代码:
  1. //pwm更新中断,约23kHz
  2. void pwma_sr(void) interrupt 26
  3. {
  4.         static U8 div=0;
  5.         static U8 zp=0,twait=0,zstate=0;
  6.         U16 v1,v2,v3,v;
  7.         S16 p1,p2,e;
  8.         U8 p,c;
  9.         PWMA_SR1=0;//清标志
  10.         //PTEST^=1;        
  11.         //----------产生三相SPWM
  12.         mot_vp+=mot_speed;
  13.         p=mot_vp>>8;//0~255
  14.         v1=(U16)SINTAB[p]*set_duty/256+20;
  15.         v2=(U16)SINTAB[(p-256/3)&0xFF]*set_duty/256+20;//移相120度
  16.         v3=(U16)SINTAB[(p-512/3)&0xFF]*set_duty/256+20;
  17.         Foc_Pwm_Swx(v1,v2,v3);
  18.         //----------产生三相SPWM
  19.         if(mot_state==0)//停止状态
  20.         {
  21.                 pwm_off();
  22.                 mot_speed=SPEED_START1;
  23.         }
  24.         else if(mot_state==1)//开环启动
  25.         {
  26.                 pwm_on();
  27.                 zstate=0;
  28.                 div++;
  29.                 if(div>=230)//10ms
  30.                 {
  31.                         div=0;
  32.                         if(mot_speed<SPEED_START2)
  33.                         {
  34.                                 mot_speed++;
  35.                         }
  36.                         else if(p<20)//达到指定速度且在初始相位附近
  37.                         {
  38.                                 mot_state++;                                
  39.                         }
  40.                 }
  41.         }
  42.         else if(mot_state==2)//闭环检测
  43.         {//在固定的相位区间里关PWM检测反电势并调速
  44.                 if(zstate==0)//等待达到指定相位关PWM
  45.                 {                        
  46.                         if(p>(256L*(DEGSET-20)/360))//提前20度
  47.                         {
  48.                                 PTEST=1;
  49.                                 zstate++;
  50.                                 pwm_off();//关PWM,关断6只MOS,
  51.                         }
  52.                 }
  53.                 else if(zstate==1)//等待过零(比较器输出0)
  54.                 {
  55.                         c=CMPCR1&1;//比较器输出
  56.                         if(c==0)//过零
  57.                         {
  58.                                 PTEST=0;
  59.                                 pwm_on();
  60.                                 zstate++;
  61.                                 //跟据相位差调整电周期,改变速度
  62.                                 v=65536/mot_speed;//电周期,
  63.                                 p1=p;
  64.                                 p2=256L*(DEGSET)/360;
  65.                                 e=p1-p2;//当前相位与目标相位相差
  66.                                 
  67.                                 if(e>20)e=20;
  68.                                 if(e<-20)e=-20;
  69.                                 v+=e/2;
  70.                                 //mot_speed=65536/v;        
  71.                                 mot_speed-=e;
  72.                                 
  73.                                 mot_vp=65536L*DEGSET/360;
  74.                         }
  75.                         if(p>=256L*(DEGSET+60)/360)//未等到过零
  76.                         {
  77.                                 zstate=0;
  78.                                 mot_state=0;
  79.                         }                        
  80.                 }
  81.                 else if(zstate==2)//等待下一周期
  82.                 {
  83.                         if(p<(256L*(DEGSET-10)/360))
  84.                                 zstate=0;
  85.                 }        
  86.         }
  87. }
  88. void main(void)
  89. {
  90. ......
  91.         while(1)
  92.         {
  93.                 if(mot_state==0)//自动重启
  94.                 {
  95.                         delayms(1000);
  96.                         mot_state=1;
  97.                 }
  98.         }
  99. }
复制代码






回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:252
  • 最近打卡:2025-12-16 23:00:17

84

主题

7145

回帖

1万

积分

超级版主

积分
15237
发表于 2025-12-8 10:57:20 | 显示全部楼层
过0检测原理描述正确,有2个过0点,检测其中一个即可,我习惯检测负半周的过0点。
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-12-16 10:58:38
已绑定手机

1

主题

43

回帖

171

积分

注册会员

积分
171
发表于 2025-12-8 11:00:06 | 显示全部楼层
梁*** 发表于 2025-12-8 10:57
过0检测原理描述正确。

谢谢梁工
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2025-12-16 21:17:24
已绑定手机

270

主题

393

回帖

2166

积分

金牌会员

积分
2166
发表于 2025-12-8 12:43:26 | 显示全部楼层
能加我个扣扣吗,想详细了解下  624353765
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-12-16 10:58:38
已绑定手机

1

主题

43

回帖

171

积分

注册会员

积分
171
发表于 2025-12-8 13:41:28 | 显示全部楼层
QQ6243*** 发表于 2025-12-8 12:43
能加我个扣扣吗,想详细了解下  624353765

先说说看有啥问题,万一我解决不了就尴尬了。
坛里大神多,总有能解决的;
在论坛里问也挺好的,别人有相同问题也一看就明白了。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2025-12-16 21:17:24
已绑定手机

270

主题

393

回帖

2166

积分

金牌会员

积分
2166
发表于 2025-12-8 15:04:02 | 显示全部楼层
lcws*** 发表于 2025-12-8 13:41
先说说看有啥问题,万一我解决不了就尴尬了。
坛里大神多,总有能解决的;
在论坛里问也挺好的,别人有相 ...

截图202512081459455443.jpg


为什么要在每个PWM周期内要更新一次PWM波形,是不是频率有点高啊
为什么不需要计算电角度,除了一个过零检测校准下,其他时候都是盲猜
还是加个扣扣吧,好多都没想通  624353765
截图202512081440489115.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-12-16 10:58:38
已绑定手机

1

主题

43

回帖

171

积分

注册会员

积分
171
发表于 2025-12-8 16:38:04 | 显示全部楼层
QQ6243*** 发表于 2025-12-8 15:04
为什么要在每个PWM周期内要更新一次PWM波形,是不是频率有点高啊
为什么不需要计算电角度,除了一个过 ...

你说的都对,每个PWM周期更新一次PWM波形,才能产生正弦波啊,不更新它不就是方波电调了?
这里FOC主打一个正弦驱动,不像方波电调那样6步就完了。
确实是不需要计算电角度、盲猜,原理和方波电调类似;
虽然方波电调在一个周期内会有6次过零,但也可以只采纳其中1次,其它的忽略掉,主要为了省电阻。
相信也有其它人和你一样的想不通,没事,多做实验验证一下。


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2025-12-16 21:17:24
已绑定手机

270

主题

393

回帖

2166

积分

金牌会员

积分
2166
发表于 2025-12-8 17:09:07 | 显示全部楼层
lcws*** 发表于 2025-12-8 16:38
你说的都对,每个PWM周期更新一次PWM波形,才能产生正弦波啊,不更新它不就是方波电调了?
这里FOC主打一 ...

频率不同步啊,电机转一圈,你的那张spwm表都不知道转了几圈了
他板子上还有两路ADC怎么没用上
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2025-12-16 10:58:38
已绑定手机

1

主题

43

回帖

171

积分

注册会员

积分
171
发表于 2025-12-8 17:27:04 | 显示全部楼层
QQ6243*** 发表于 2025-12-8 17:09
频率不同步啊,电机转一圈,你的那张spwm表都不知道转了几圈了
他板子上还有两路ADC怎么没用上
...

确实不同步啊,电角度和机械角度不一样的,有个倍数关系,好像就叫“极对数”,方波电调也一样,一般不会六步就转一圈。

ADC没用上,作为备用,我猜是后面要研究高频注入之类的,或利用MOS管导通电阻作为电流检测之用。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:492
  • 最近打卡:2025-12-16 21:17:24
已绑定手机

270

主题

393

回帖

2166

积分

金牌会员

积分
2166
发表于 2025-12-8 17:40:58 | 显示全部楼层
梁*** 发表于 2025-12-8 10:57
过0检测原理描述正确,有2个过0点,检测其中一个即可,我习惯检测负半周的过0点。 ...

检测负半周和正半期有区别吗

点评

两相电枢电压做过0检测,正半周是135度下降沿过0,负半周是315度上升沿过0,负半周过0点更接近一个新周期的开始点。而其实其效果是等同的,但要区分上升沿还是下降沿。 如果是3相电枢重建中点电压,则负半周过0点就  详情 回复 发表于 2025-12-8 18:48
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-12-17 10:27 , Processed in 0.135957 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表