|
发表于 2012-3-11 14:55:04
|
显示全部楼层
回复【楼主位】liguanmao
-----------------------------------------------------------------------
看了<<设计全攻略>>做无刷电调,做的好晕,还是没做好,现在勉强能转,但是好慢,还不均匀,一碰就停,改占空比转速没什么变化,电路没有问题。估计反电动势处理有问题。。帮我看看吧。
程序就是这样的,电路基本和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)
{
}
}
哎,还是转不起来,示波器看引脚的波形,很乱。。
(原文件名:Image00000.jpg) |
|