|
发表于 2023-10-7 21:59:39
|
显示全部楼层
梁工,
我在试产发现,这个程序1/10概率不能正常启动, 不得已写了下面重启程序(遇到异常,让马达重启)现在我将正常和非正常启动波形及正常工作波形,都附着附件下面,
我现在不清楚异常启动是什么引起的,有没有办法检测到异常,进行及时修正,避免重启?
if(PhaseTime>=4000)overtime_number++;//小于2500RPM 会堵转计数器会计数
if((PhaseTime <= PhaseTime_average) || (PhaseTime<= 400 ))short_time_number++;//如果相位小于平均值的1/2,将会相位异常计数。
1,此水泵电机应该不是高速电机,消磁我从40us-200us都取值试过,100us好像正常概率高些,我目前取值100us
T2H = (u8)((65536UL - 100*2) >> 8); //装载消磁延时
T2L = (u8)(65536UL - 100*2);
AUXR |=0x10; //Timer2开始运行, 等于延迟100us再检测,比较中断-21,避免触发误检测。
}
else if(XiaoCiCnt == 2) XiaoCiCnt = 0; //1:需要消磁, 2:正在消磁, 0已经消磁
}
2,马达启动程序,我测试过好多次,目前驱动初始值60,驱动概率高些
关于初次赋值,我从示波器开始一个周期波形时间大概是18ms,所以赋值,是,5000+7*2000,这个赋值,我从400到2000都试过,好像差异不大
for(i=0; i<8; i++) PhaseTimeTmp[i] = 2000;
motor_lockedtime=1; TH0 = 0; TL0 = 0;
u8 StartMotor(void)
{
u16 timer,k;
PWM_Value=60;
Step = 0;
StepXL();
DISABLE_CMP_INT;
Delay5ms();Delay5ms();Delay5ms();Delay5ms();
Delay5ms();Delay5ms();Delay5ms();Delay5ms();//40ms,delay_ms(5);
timer = 300;
while(1)
{
for(k=0; k<timer; k++)Delay70us(); //
timer -= timer /14+1;
if(timer < 25) return(1);
if(Step<5) Step++;
else Step = 0;
StepXL();
}
if(motor_start_flag==1) //马达启动
{
motor_start_flag=0;
B_start=1;
StartMotor();
for(i=0; i<8; i++) PhaseTimeTmp[i] = 2000;
motor_lockedtime=1; TH0 = 0; TL0 = 0;
motor_RUN=1; XiaoCiCnt = 0; //初始进入时
CMPCR1 &= ~0x40; B_start=0; // 清除中断标志位
if(Step%2==0) CMPCR1 =0x9C; //下降沿中断
else CMPCR1 =0xAC; //上升沿中断
}
3,比较器中断程序, 我将,PhaseTime=0; 从for语句移到外面,不知道是否有影响?
PhaseTime=0;
for(i=0; i<8; i++) PhaseTime += PhaseTimeTmp[i]; //求8次换相时间累加和
void CMP_INT(void) interrupt 21
{
u8 i;
CMPCR1 &= ~0x40; // 需软件清除中断标志位
Red_LED=~Red_LED;
if(XiaoCiCnt == 0)
{
TR0=0; // Timer0停止运行
if( motor_lockedtime==1 ) //切换时间间隔(Timer0)有溢出,中断间隔:32ms
{
motor_lockedtime = 0;
PhaseTime =5000;
}
else
{
PhaseTime = (((u16)TH0 << 8) + TL0) >> 1; // Time0 12T的一个时钟为0.5us, 定时器时间换算单位为us,定时器时间/2
if(PhaseTime >= 5000)PhaseTime=5000;// 一圈360度所用时间= 500us*6 (相数)*2 (2对极/四级转子)=6ms, rpm=1000ms/6ms*60(分钟)=10000,超过转速会保护
}
if(PhaseTime>=4000)overtime_number++;//小于2500RPM 会堵转计数器会计数
if((PhaseTime <= PhaseTime_average) || (PhaseTime<= 400 ))short_time_number++;//如果相位小于平均值的1/2,将会相位异常计数。
TH0 = 0; TL0 = 0;
TR0=1; // Timer0运行
PhaseTimeTmp[TimeIndex] = PhaseTime; //保存一次换相时间
if(++TimeIndex >= 8) TimeIndex = 0; //累加8次
PhaseTime=0;
for(i=0; i<8; i++) PhaseTime += PhaseTimeTmp[i]; //求8次换相时间累加和
PhaseTime = PhaseTime >> 4; // >>4 = 值/16 ,求8次换相时间的平均值的一半, 即30度电角度
PhaseTime_average=PhaseTime;// 求8次换相时间的平均值1/2
if( PhaseTime<=312 )over_speed_number++; // 超过8000PRM,计数200次进行保护
if( PhaseTime >= 150) PhaseTime -= 50; //修正由于滤波电容引起的滞后时间,50us的滤波电容滞后时间
else
PhaseTime = 150;
AUXR &=~0x10; //Timer2停止运行
PhaseTime = PhaseTime << 1; // 2个12T 时钟为计数1us
PhaseTime = 0 - PhaseTime;
T2H = (u8)(PhaseTime >> 8); //装载30度角延时
T2L = (u8)PhaseTime;
AUXR |=0x10; //Timer2开始运行,
XiaoCiCnt = 1; //1:需要消磁, 2:正在消磁, 0已经消磁
}
}
|
|