做电调遇到问题,反复调试问题依旧,请高手指点
自己做电调,发现许多 问题些问题是做好覆铜板以后才发现的
我用的是夏风的电路图和MK的电路图和组合
主要是上下臂全N沟的MOS和自举升压。
电源滤波用的是MK的
但我用的AVR的168-20单片机外接的16M晶振。
夏风用的是51开机默认是1而AVR单片机开机默认是0,是低电平,而夏风的电路图,上臂是低电平导通的。
但我想这应该不是什么问题。
现在我用的是USB口的电源做调试。
不接任何负载
在主程序里运行 Manuell()函数的循环中间延时1S
现在的状态是,在10%PWM时运行大约20S就会输出三项中的一项的上下臂时就会导通。如果加大PWM当快达到100%时,基本是接上电源三项中的一项的上下臂立刻就会导通。
出问题时,上臂的状态是全开,下臂无法测量,我一用万用量测量,测量到出问题的下臂时,单片机就会重起
不知道是怎么回事。请高手指点。以下是我的电路图一实验板
板子上我有点改动,原来的上臂和下臂和现在是相反的,有几个电容我没焊,那个1000UF的一开始我焊上了,后来又拿下来了,可是问题依旧。
http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631623TP6XOO.jpg
(原文件名:未命名.jpg)
http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631626F7QCB7.jpg
(原文件名:未命名1.jpg)
http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631627XX6E4N.jpg
(原文件名:未命名2.jpg) int main(void){
DDRC=0x00; // 0b0000 0000
PORTC=0x30;// 0b0011 0000
DDRB=0x0E; // 0b0000 1110
PORTB=0x31;// 0b0011 0001
DDRD=0x3A ; //0b0011 1010
PORTD=0x31; //0b0011 1000
sei();
Timer_Init();
PWM_Init();
PWM=50;
SetPWM();
//Manuell();
//Anwerfen(10);
while(1){
//Anwerfen(100);
//Delay_ms(5000);
for(int i=0;i<6;i++){
Phase=i;
Manuell();
Delay_ms(1000);
}
主程序只有一些初始化和一个Manuell();
的调试不断调用。
下面是Manuell();函数
void Manuell(void)
//############################################################################
{
switch(Phase)
{
case 0:
STEUER_A_H;
STEUER_B_L;
// SENSE_C;
// SENSE_RISING_INT;
break;
case 1:
STEUER_A_H;
STEUER_C_L;
// SENSE_B;
// SENSE_FALLING_INT;
break;
case 2:
STEUER_B_H;
STEUER_C_L;
// SENSE_A;
// SENSE_RISING_INT;
break;
case 3:
STEUER_B_H;
STEUER_A_L;
// SENSE_C;
//SENSE_FALLING_INT;
break;
case 4:
STEUER_C_H;
STEUER_A_L;
// SENSE_B;
//SENSE_RISING_INT;
break;
case 5:
STEUER_C_H;
STEUER_B_L;
//SENSE_A;
//SENSE_FALLING_INT;
break;
}
}
下面是一些预定义
#define PWM_A_ON{TCCR1A = 0xA1; TCCR2A=0x81; DDRB = 0x08;}
#define PWM_B_ON{TCCR1A = 0xA1; TCCR2A=0x81; DDRB = 0x04;}
#define PWM_C_ON{TCCR1A = 0xA1; TCCR2A=0x81; DDRB = 0x02;}
#define PWM_OFF {OCR1A = 0; OCR1B = 0;TCCR1A = 0x01; OCR2A=0;TCCR2A=0x01; DDRB = 0x0E; PORTB &= ~0x0E;}
//OCR2B TCCR2A=0x21;
#defineSTEUER_A_L {PWM_A_ON}
#defineSTEUER_B_L {PWM_B_ON}
#defineSTEUER_C_L {PWM_C_ON}
#defineSTEUER_A_H {PORTD |=0x30;PORTD &= ~0x08;}//对B和C项清零,对A项置1,以下同理
#defineSTEUER_B_H {PORTD |=0x28;PORTD &= ~0x10;}
#defineSTEUER_C_H {PORTD |=0x18;PORTD &= ~0x20;} 没人能帮帮心吗? PWM频率多少,我当是这么弄的时候每相的delay大概在30ms,1s太长了,本来开环就很容易烧MOS管,你把时间调这么大,应该会增大烧管的概率吧,你把间隔时间调小,PWM频率增大试试看呗 PWM频率越加大,上下管导通的越快
其实如果我不加Delay延时,反而不会出现上下管同时导通(无论多少PWM)
但我用大PWM就是Delay延时1MS都不行,马上就不行,一接上电源上下管立刻同时导通
我现在不明白,为什么开环加延时时容易引起上下管同时导通呢?让我很困扰
理论上我那样的程序是不存在同时导通的情况的 还有个问题,是不是上下管一蛋导通过,MOS管就肯定会被击穿啊?
我用5V的USB电源做实验,现在老是上下管导通。不过,感觉好象还没击穿啊 MK的程序里不是用SetPWM(5)启动的吗,你现在试试PWM(5)启动,我之前实验在开环中启动电机,MOS管很容易发热,而且只要堵转,就会迅速产生高温,我之前在开环是也是想人工给相位,但发现这样很容易烧MOS管,你说的上下管导通的情况,是怎么判断出来的,电机接入后状况是什么样的,原地抖动还是反转什么的 今天我把上臂用做开关的9013换成了PNP型的9012
这样就变成了1导通0断开,和AVR的初始值相同。
然后我调试程序
for(int z=0;z<1;z++){
for(int i=0;i<6;i++){
Phase=i;
Manuell();
Delay_ms(10);
}
}
用上面的一段,在WHILE(1)以外
现在的情况是在低PWM下
PWM=10 时可以运行32个周期
PWM越高可以运行的周期越短
当我调高到PWM=200时Manuell();
函数连一个周期都运行不了。
看来与Delay_ms延时函数没什么关系,问题好象还是出在电路上。
现在我认为上臂的开关管已经没什么问题了。虽然由于电阻的位置不对,造成PNP型的上拉电压只有不到5V,但低电平基本在0.65V以下应该可以满足应用。
现在我怀疑是下臂的PWM干扰引起的问题。因为我在实验PWM时,如果三路输出PWM,如果只输出其中一路另两路关闭的话,关闭的两路不能完全关闭。不知道是由于什么原因,现在还没找到原因。
明天给下臂的PWM加上下拉电阻,看能不能解决问题。
现在我怀疑PWM上两个问题。
1.PWM相互干扰,由其在大PWM时更为严重。 (这个如果加下拉电阻应该可以解决吧)
2.由于我布线的原因,把PWM的控制输出线布在了5V电源线的边上,不知道这个会不会有问题。(这个不知道怎么解决,只能重新画板)
先写这么多吧,没人帮自己搞,而且我电路是从零开始的,真的挺难的。
睡了。。。。。。。。。。。。 回复【6楼】kkking
mk的程序里不是用setpwm(5)启动的吗,你现在试试pwm(5)启动,我之前实验在开环中启动电机,mos管很容易发热,而且只要堵转,就会迅速产生高温,我之前在开环是也是想人工给相位,但发现这样很容易烧mos管,你说的上下管导通的情况,是怎么判断出来的,电机接入后状况是什么样的,原地抖动还是反转什么的
-----------------------------------------------------------------------
你看我的回复吧,我昨天把B项的下臂段开了。刚才忘说了。
我用10的PWM在断开B项下臂的情况下可以运行32个Manuell();函数。
而且一运行到33个Manuell();函数必然会出现上下管同时导通。
上下管同时导通时,我的上臂是全开状态。下臂只开导通的那个管。
而且在上下臂同时导通时,我一量下臂导通的那个管,单片机就会重起。
还有我至今不明白,为什么不能长时间的开环运行。理论上说不存在同时导通的情况。
我现在还没接负载,什么都没接。
用的5V的USB供电在做实验。
上下同时导通应该相当于电源和地直接连接。会输出最大电流。
我现在用5V的USB供电,就是上下同时导通也不会击穿MOS。但会严重发热,我现在接了一个电流表,一导通,我就断电。
我的QQ:1204373580 希望一起交流 现在我用的是USB口的电源做调试?
能提供那么大电流吗? 回复【9楼】okARM
现在我用的是usb口的电源做调试?
能提供那么大电流吗?
-----------------------------------------------------------------------
我没接负载,只是开环测试,如果上下管不同时导通就不会形成回路,基本没有电流,实测只有20毫安 什么叫PWM不能完全关闭,其他两路波形是什么样的,我之前试过关掉PWM的使能寄存器,也是关不掉其他两路波形,最后将其他两路PWM直接占空比设为0,就没什么影响了 回复【9楼】okARM
-----------------------------------------------------------------------
就是,买个旧的电脑开关电源嘛,就十几块钱 回复【11楼】kkking
什么叫pwm不能完全关闭,其他两路波形是什么样的,我之前试过关掉pwm的使能寄存器,也是关不掉其他两路波形,最后将其他两路pwm直接占空比设为0,就没什么影响了
-----------------------------------------------------------------------
哥们,我好象改电路改成功了
呵呵。
我在PWM的下臂上加了10K的下拉电阻
问题好象全部解决了。
你也可以试试。
我现在用250的PWM,运行1000个周期都没问题每个Manuell();延时10MS,现在B项是断开的。
一共运行50S呢,我想问题应该是解决人了。
你也试试吧。 问题应该是解决了。
一个下臂的PWM下拉电阻,解决了好几周的难题。
这个电阻源自哪个贴里的一个大侠的一句话,忘了谁说的了。不过先感谢一下。
现在的电路应该很建康了。
用AVR的,如果用夏风的电路,上臂的NPN管,应该改成PNP管更合适AVR 的默认电平,电路也要做下小改动,不改只改成9012的PNP也可以正常运行(等有时间我再试试改一下电路)
问题,总结。
应该是PWM的信号不干净造成的,或是引脚在关闭时,不能完全关闭总是受到其它引脚的干扰。
加了下拉以后,低电平更干净了,在PWM低边时MOS管关断更干净。
这样不会造成上下管同时导通,烧MOS管的惨况了。
幸好我做测试用的是5V的USB电源,不然我看现在我也烧了N个MOS管了。现在一个都没烧,看来我当初的决定还是对的。
总算可以接着做下去了,下一步是调试模拟比较器和过流检测。一步一步来吧。
做到步步为赢,也通过做这个电调,对AVR单片机有一个更深的认识,
为接下来做飞控打下坚实的基础。
这贴不想关了,做个日志吧,我会把进度和一些没解决和解决的都尽量写下来。
今天解决个难题还是挺兴奋的。又前进了一步啊!高兴中。。。 今天调试ADC部分的代码。
发现个很大的错误,我的电调板上把AREF悬空了。既没有上拉电阻也没有滤波电容。而且
我看了一下板子,连改动的空间都没有。
现在只有用内部的标准电压了,不知道没有滤波电容会不会产生大问题。 工夫没有白费啊!
刚刚闭环手动起动成功了。
相当的兴奋了。
说明电路都没有问题。
但现在的PWM比较大,而且采用的MK的直接换向。
现在用万用表测不到自举升压。
我想可能是PWM太大了,现在是(250)
因为我现在用的是USB的5V起动的
现在是5V电源,电流是140MA
测试用的是硬盘电机,上面有一片盘片。
硬件电路没问题就好办了。
接下来,就是完善程序,还有起动算法等等了。
现在还在兴奋中。。。。。。
页:
[1]