demon75 发表于 2011-11-18 13:03:23

求助那么多次,来两次前辈的援助吧……关于电调,真心不懂了……

情况说明:
         电路:       德国人的1.2版电路图
   编译环境:       avr studio 5
          MCU:       ATmega8L
         电机:       新西达2212 1000KV 电机   
         问题:       通电后,电机哧哧的响,不转。
已查明的情况:       M8供电,VCC接12V电源时:查A+,B+,C+上臂(三极管的基极处),无PWM波。
                     M8供电,VCC接5V电源时:查A+,B+,C+上臂(三极管的基极处),无PWM波。
                     M8供电,VCC不接电源时:查A+,B+,C+上臂(三极管的基极处),有PWM波。
                     三极管使用S9013,不使用芯片,手动检查时:基极接5V,VCC接12V,上臂均能导通。
   芯片情况:       因为使用的编程器,无法读出校准字,所以采用内部8M,无效准时钟。产生的PWM波,经过测试,为24KHZ左右。
       附程序:
#defineCHAU_ON    {TCCR2=0x41;TCCR1A=0x81;}         //OC1A通道选通
#defineCHBU_ON    {TCCR2=0x41;TCCR1A=0x21;}         //OC1B通道选通
#defineCHCU_ON    {TCCR1A=0x01;TCCR2=0x61;}         //OC2通道选通
#defineCHAD_ON    {PORTD=0x00;PORTD|=0x01;}          //A下臂通道打开pd0
#defineCHBD_ON    {PORTD=0x00;PORTD|=0x02;}          //B下臂通道打开pd1
#defineCHCD_ON    {PORTD=0x00;PORTD|=0x04;}          //C下臂通道打开pd2
                                 void Tpwm_init(void)
                                 {
                                 // T/C1 初始化
                                 TCCR1A=0x01;    //暂时不给通道输出,但是已经产生了PWM波,选用快速PWM模式。
                                 TCCR1B=0x01;    //匹配时清零,TOP:255
                                 OCR1A=0;      
                                 OCR1B=0;   
                                 // T/C2 初始化
                                 TCCR2=0x41;    //暂时不给通道输出,TOP:255,
                                 OCR2=0;      //占空比:用rate调节
                                 }
                                 void PWMC(void)             //PWM使能;
                                 {
                                    OCR1A=50;      
                                    OCR1B=50;
                                    OCR2=50;        
                                 }                
                                 void Slave(void)                  //从机全初始化
                                 {
                                    
                                     OSCCAL=0xFF;
                                     DDRB=0x0F;
                                     DDRC=0x00;
                                     DDRD=0x87;
                                     PORTB=0x00;
                                     PORTC=0x00;
                                     PORTD=0x00;
                                 }
                                 void Origin(void)      //转动程序
                                 {
                                 switch (State)
                                     {
                                 case 0:
                                                      CHBD_ON
                                                CHAU_ON
                                                State=1;
                                                break;   
                                 case 1:
                                                   CHCD_ON
                                                 CHAU_ON                                 
                                                 State=2;
                                           break;
                                 case 2:
                                                      CHCD_ON                                 
                                                CHBU_ON
                                                State=3;
                                          break;
                                 case 3:
                                                      CHAD_ON
                                                CHBU_ON
                                                State=4;
                                          break;   
                                 case 4:
                                                      CHAD_ON
                                                CHCU_ON
                                                State=5;
                                          break;
                                 case 5:
                                                   CHBD_ON
                                                 CHCU_ON
                                                 State=0;
                                                 break;
                                        }
                                 }
                                 void delay_us(double us)//微秒级定时
                                 {
                                    TCNT0=0x00;
                                    while(TCNT0<us);       
                                 }
                                 void delay_ms(double ms) //毫秒级定时
                                 {
                                    uint j;
                                    while(ms--)
                                     {
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    delay_us(99);
                                    
                                     }
                                           
                                 }
                                 void time_Init(void)       //定时器0初始化
                                 {
                                         TCCR0=0x02;                   //系统八分频          
                                 }
                                 /*void int1_init(void)
                                 {
                                 MCUCR|=0x08;
                                 GICR |=0x80;
                                 } */
                                 /*SIGNAL(SIG_INTERRUPT1)
                                 {   
                                       flag=255;
                                 RL_ON;
                                    while(flag--) ;
                                 State++;
                                 State%=6;
                                 RL_OFF;
                                 } */
                                 int main(void)
                                 {
                                 //sei();
                                 Slave();
                                 time_Init();
                                 Tpwm_init();
                                 PWMC();
                                 //int1_init();
                                       while(1)
                                       { for (flag=0;flag<200;flag++)
                                       {
                                                 delay_ms(1);
                                       }
                                           RL_ON;
                                       Origin();
                                           RL_OFF;
                                       }
                                 }
*************************************************************************************************************************************
请前辈们帮帮我,谢谢啦……

Clinging 发表于 2011-11-18 13:09:23

原理、方向性的东西可以问问,你贴一堆乱七八糟的代码,谁有工夫看?更何况这种问题能靠别人么?

demon75 发表于 2011-11-18 13:15:03

回复【1楼】Clinging 哆拉C梦
-----------------------------------------------------------------------

其实,程序就是让这个电机一步一步慢慢动动……但是不清楚为什么PWM为什么会消失……昨天还遇到过更奇怪的问题,就是单查上臂的P管,给接地,能导通……三极管接5V,能拉低到0……但是两个连起来,给三极管基极接5V……结果管子是通了,但是电压只有1.2V,而且5秒左右就烧了……

demon75 发表于 2011-11-18 23:44:03

问题解决……
解释原因,供后来人参考:
洞洞板质量问题,部分洞口是通路……
今天重新制作,PWM波无误……
因为编译器编译后的延时函数有问题,所以启动算法,还在尝试中……
页: [1]
查看完整版本: 求助那么多次,来两次前辈的援助吧……关于电调,真心不懂了……