搜索
bottom↓
回复: 10

请教反电势法驱动无刷直流电机中反电势过零点后延迟30°的程序

[复制链接]

出0入0汤圆

发表于 2011-9-19 23:13:52 | 显示全部楼层 |阅读模式
用avrstudio编的程序,打算烧在atmega88上的。
我用电平变化中断来确定反电势过零点,然后就不知道延迟30°电角度要怎么编写了。菜鸟一个,大家勿笑。
下面是自己写的一段程序,但是其中没有延迟电角度的程序。就是电平变化产生中断了,然后根据反电势过零检测电路中3个比较器反馈给单片机的不同的输入信号来开关6个MOSFET

ISR(PCINT1_vect)
{
  if ((PINC|0X00)==0X06)//phase_01, V2 and V3 on
  {
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD=(0<<UH)|(1<<VH)|(0<<WH);
  PORTB=(1<<UL)|(1<<VL)|(0<<WL);

  TCCR0A = (UH_OFF)|(VH_ON)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_OFF)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
  
  if ((PINC|0X00)==0X04) //phase_02, V3 and V4 on
{
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD = (0<<UH)|(1<<VH)|(0<<WH);
  PORTB = (0<<UL)|(1<<VL)|(1<<WL);

  TCCR0A = (UH_OFF)|(VH_ON)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_OFF)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
  
  if ((PINC|0X00)==0X0C) //phase_03, V4 and V5 on
  {
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD = (0<<UH)|(0<<VH)|(1<<WH);
  PORTB = (0<<UL)|(1<<VL)|(1<<WL);

  TCCR0A = (UH_OFF)|(VH_OFF)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_ON)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
  
  if ((PINC|0X00)==0X08) //phase_04, V5 and V6 on
  {
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD = (0<<UH)|(0<<VH)|(1<<WH);
  PORTB = (1<<UL)|(0<<VL)|(1<<WL);

  TCCR0A = (UH_OFF)|(VH_OFF)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_ON)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
  
  if ((PINC|0X00)==0X0A) //phase_05, V6 and V1 on
  {
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD = (1<<UH)|(0<<VH)|(0<<WH);
  PORTB = (1<<UL)|(0<<VL)|(1<<WL);

  TCCR0A = (UH_ON)|(VH_OFF)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_OFF)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
  
  if ((PINC|0X00)==0X02) //phase_06, V1 and V2 on
  {
  DDRD=(1<<UH)|(1<<VH)|(1<<WH);
  DDRB=(1<<UL)|(1<<VL)|(1<<WL);
  PORTD = (1<<UH)|(0<<VH)|(0<<WH);
  PORTB = (1<<UL)|(1<<VL)|(0<<WL);

  TCCR0A = (UH_ON)|(VH_OFF)|(1<<WGM00);
  TCCR0B = (1<<CS00);
  TCCR2A = (WH_OFF)|(1<<WGM20);
  TCCR2B = (1<<CS20);
  }
}

出0入0汤圆

发表于 2011-9-19 23:28:43 | 显示全部楼层
2过零点之间是180 or 360度?

出0入0汤圆

发表于 2011-9-20 01:06:24 | 显示全部楼层
回复【1楼】823032003 尼美根
-----------------------------------------------------------------------

如果只看一个相线上的2个过零点,那就是是360度。若是三个相线一起看的话,相邻2个过零点是60度。

出0入0汤圆

发表于 2011-9-20 07:03:56 | 显示全部楼层
利用最近的两次过零时刻之间的时间差就是60点角度,将这个时间差放入定时器,在过零之后启动定时器,定时器中断中换相。

出0入0汤圆

发表于 2011-9-20 07:22:27 | 显示全部楼层
学习

出0入22汤圆

发表于 2011-9-20 08:28:28 | 显示全部楼层
这个换向没这么简单,,

1.并不一定装入的是30度电角度的颜色。
2.你还需要预测下一次的过零时间,一般到时候即使没有检测到过零事件,也要强制触发。

出0入0汤圆

发表于 2011-9-20 14:00:32 | 显示全部楼层
预测,一般不需要预测,而是根据前一次的速度估算,假定前一次和这次的速度变化不大,然后这样进行计算。

出0入0汤圆

 楼主| 发表于 2011-9-21 15:58:25 | 显示全部楼层
回复【1楼】823032003  尼美根
-----------------------------------------------------------------------

单线上的两个过零点是180°,三相来看的话是60°。

出0入0汤圆

 楼主| 发表于 2011-9-21 16:12:54 | 显示全部楼层
回复【3楼】tiancaigao7  天才杨威利
-----------------------------------------------------------------------

请教一下高手如何获得时间差,是用定时器的捕捉功能吗?!能说的详细点吗?勿怪,刚学的c编程。

出0入0汤圆

发表于 2013-4-7 13:08:28 | 显示全部楼层
读取定时器的数值来计时就行了

出0入0汤圆

发表于 2018-4-21 10:28:40 | 显示全部楼层
lixin91985 发表于 2011-9-20 08:28
这个换向没这么简单,,

1.并不一定装入的是30度电角度的颜色。

领教!!高手!大师!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 23:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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