|
发表于 2024-7-23 17:02:14
|
显示全部楼层
梁工,
我是用STC408AS写的无刷电机程序,最近有开发一个低速版本,客户在使用时候,发现有偶尔不能启动问题。
产品都已经灌胶了,我直接在比较器中断和定时器中断插入~LED看下波形。
现在问题是启动后运行一段时间,波形是正常的。但是刚开始的波形有些奇怪。宽窄相差很大。
开始时候,我观察刚一个两个step大概是6ms,我设置开始PhaseTimeTmp[i]都是2000ms賦值。
下面这段程序,应该每次只赋值PhaseTimeTmp【】,应该对整体影响不大?为啥开始运行的时候宽窄差异这么大?
程序哪里写的不对?
***********************************
PhaseTimeTmp[TimeIndex] = PhaseTime; //保存一次换相时间
if(++TimeIndex >= 8) TimeIndex = 0; //累加8次
PhaseTime=0;
********************************************
if(motor_start_flag==1) //马达启动
{
run_time_period=0;//清零运行阶段的相位波形计数
motor_start_flag=0;
B_start=1;
StartMotor();
for(i=0; i<8; i++) PhaseTimeTmp[i] = 2000;
motor_lockedtime=0; TH0 = 0; TL0 = 0; //启动赋值一个换相为400ms,换相时间不能太长,会和启动程序后面波形叠加
low_speed_number=0; PWM_Value_flag=0;//重置低速计数
motor_RUN=1; XiaoCiCnt = 0; //初始进入时
CMPCR1 &= ~0x40;
Delay100us();
B_start=0; // 清除中断标志位
if(Step%2==0) CMPCR1 =0x9C; //下降沿中断
else CMPCR1 =0xAC; //上升沿中断
}
*****************************************
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 =6000; //0.4漆包线PhaseTime=5000 ,0.3漆包线PhaseTim=6000
}
else
{
PhaseTime = (((u16)TH0 << 8) + TL0) >> 1; // Time0 12T的一个时钟为0.5us, 定时器时间换算单位为us,定时器时间/2
if(PhaseTime >= 6000)PhaseTime=6000;// 一圈360度所用时间= 500us*6 (相数)*2 (2对极/四级转子)=6ms, rpm=1000ms/6ms*60(分钟)=10000,超过转速会保护
}
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 <<1; // 单次相位平均时间
if(PhaseTime_average<=over_speed_limit )over_speed_number++; //限速详见over_speed_limit定值
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已经消磁
}
}
*********************************
void CMP_INT(void) interrupt 21
{
u8 i;
CMPCR1 &= ~0x40; // 需软件清除中断标志位
Red_LED=~Red_LED;
|
-
-
|