aishiqi1992 发表于 2012-3-11 11:47:44

看了<<设计全攻略>>做无刷电调,做的好晕,还是没做好,现在

程序就是这样的,电路基本和MK的的电路差不多,只不过反感应电动势检测的引脚不一样而已。我用了ADC3,2,1.

#include <iom8v.h>

#define uchar unsigned char
#define uint unsigned int

#define PHASE_A_ON PORTD|=0x08;
#define PHASE_A_OFF PORTD&=0xf7;

#define PHASE_B_ON PORTD|=0x10;
#define PHASE_B_OFF PORTD&=0xef;

#define PHASE_C_ON PORTD|=0x20;
#define PHASE_C_OFF PORTD&=0xdf;

#define PWM_A_ON OCR2=pwmduty;
#define PWM_A_OFF OCR2=0;

#define PWM_B_ON OCR1B=pwmduty;
#define PWM_B_OFF OCR1B=0;

#define PWM_C_ON OCR1A=pwmduty;
#define PWM_C_OFF OCR1A=0;

#define AB_ON PWM_B_OFF PWM_C_OFF PHASE_A_OFF PHASE_C_OFF PWM_A_ON PHASE_B_ON
#define AC_ON PWM_C_OFF PWM_B_OFF PHASE_B_OFF PHASE_A_OFF PWM_A_ON PHASE_C_ON
#define BC_ON PWM_A_OFF PWM_C_OFF PHASE_A_OFF PHASE_B_OFF PWM_B_ON PHASE_C_ON
#define BA_ON PWM_A_OFF PWM_C_OFF PHASE_B_OFF PHASE_C_OFF PWM_B_ON PHASE_A_ON
#define CA_ON PWM_A_OFF PWM_B_OFF PHASE_B_OFF PHASE_C_OFF PWM_C_ON PHASE_A_ON
#define CB_ON PWM_A_OFF PWM_B_OFF PHASE_A_OFF PHASE_C_OFF PWM_C_ON PHASE_B_ON

#define TEST_AR ADMUX=0x03; ACSR=0x1a;
#define TEST_BR ADMUX=0x02; ACSR=0x1a;
#define TEST_CR ADMUX=0x01; ACSR=0x1a;

#define TEST_AF ADMUX=0x03; ACSR=0x1b;
#define TEST_BF ADMUX=0x02; ACSR=0x1b;
#define TEST_CF ADMUX=0x01; ACSR=0x1b;

#define STOP 0
#define STARTUP 1
#define RUN 2



uchar pwmduty=80;
uchar state=STOP;
//uchar start
uchar phase=0;
uint startdelay=1000;
uint startdelay2=1000;
uchar chtimes=0;

portinit()
{
DDRD=0x38;
PORTD=0x00;
DDRB=0xfe;
PORTB=0x00;
DDRC=0x00;

}

uinit()
{
UBRRL=51;
UCSRB|=0x88;


}

sendchar(char ch)
{
while(!(UCSRA&0x20));
UDR=ch;}

sendstr(char *str)
{unsigned int i;
i=0;
while(str!='\0')
{sendchar(str);
i++;
}}

pwminit()
{
TCCR1A=0xa1;
TCCR1B=0x01;
OCR1A=0x00;
OCR1B=0x00;
TCCR2=0x61;
OCR2=0x00;
}

acmpinit()
{
SFIOR|=0x08;
ACSR=0x12;
ADMUX=0x01;
}

#pragma interrupt_handler acsvr:17

acsvr()
{

change_phase();

}


T0init()
{

TCCR0=0x01;
TIMSK|=0x01;
SREG|=0x80;

}
#pragma interrupt_handler t0svr:10

t0svr()
{/*
if(state==STARTUP)
{
        if(chtimes<30)
        {
                if(!(startdelay2--))
                        {
                        pwmduty=20;
                        change_phase();
                        startdelay=startdelay*14/15;
                        startdelay2=startdelay;
                       
                        chtimes++;

                          return;

                             }
        }
        else run();
}
*/

}

startup()
{
ACSR=0x12;
pwmduty=5;
TCCR0=0x02;
startdelay=1000;
startdelay2=10000;
chtimes=0;
change_phase();
state=STARTUP;
}

run()
{
ACSR=0x1a;
state==RUN;
}

change_phase()
{
if(phase==0){AB_ON phase=1;TEST_CF sendstr("PHASE 0\r\n"); return;}
if(phase==1){AC_ON phase=2;TEST_BR sendstr("PHASE 1\r\n"); return;}
if(phase==2){BC_ON phase=3;TEST_AF sendstr("PHASE 2\r\n"); return;}
if(phase==3){BA_ON phase=4;TEST_CR sendstr("PHASE 3\r\n"); return;}
if(phase==4){CA_ON phase=5;TEST_BF sendstr("PHASE 4\r\n"); return;}
if(phase==5){CB_ON phase=0;TEST_AR sendstr("PHASE 5\r\n"); return;}
}


main()
{
portinit();
pwminit();
T0init();
acmpinit();
uinit();
//startup();
run();
while(1)
{


}
}


哎,还是转不起来,示波器看引脚的波形,很乱。。http://cache.amobbs.com/bbs_upload782111/files_53/ourdev_725745HA3E7C.jpg
(原文件名:Image00000.jpg)

hy317 发表于 2012-3-11 11:53:03

感觉是驱动顺序不对

aishiqi1992 发表于 2012-3-11 16:55:07

回复【1楼】hy317
感觉是驱动顺序不对
-----------------------------------------------------------------------
change_phase()
{
if(phase==0){AB_ON phase=1;TEST_CF sendstr("PHASE 0\r\n"); return;}
if(phase==1){AC_ON phase=2;TEST_BR sendstr("PHASE 1\r\n"); return;}
if(phase==2){BC_ON phase=3;TEST_AF sendstr("PHASE 2\r\n"); return;}
if(phase==3){BA_ON phase=4;TEST_CR sendstr("PHASE 3\r\n"); return;}
if(phase==4){CA_ON phase=5;TEST_BF sendstr("PHASE 4\r\n"); return;}
if(phase==5){CB_ON phase=0;TEST_AR sendstr("PHASE 5\r\n"); return;}
}
我的换相程序没有问题啊。。也不知道为什么就变成那个波形了。

inspiriting 发表于 2012-4-13 13:59:19

留个脚印,还在继续学习中

xuxe2005 发表于 2012-5-16 09:57:59

电路图传上来看看,换相是怎么检测的。德国老用的是电压比较器的,你用的不会是AD转换器吧。
页: [1]
查看完整版本: 看了&lt;&lt;设计全攻略&gt;&gt;做无刷电调,做的好晕,还是没做好,现在