|
问题如题,外部8MHZ,如果函数信号发生器或者另外的MEGA16发出来的固定PWM,电机不会出现跳变,但是我显示的速度值还是会出现跳变,所以我就怀疑计数器0这边有问题
部分程序如下:
void Timers_Initial(void)
{
// Timer/Counter0
OCR0 = 0xff; //
TCNT0 = 0x00;
TCCR0 = 0x07; //
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = (4000>>8)&0xff;//最大10000,先写高字节,再写低字节
ICR1L = 4000&0xff;
OCR1AH = 0x00;
OCR1AL = 0x00;
TCCR1A = (1<<COM1A1)|(1<<WGM11);
TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
//T/C2初始化 2ms
ASSR = 0x00;
TCNT2 = 0x00; //
OCR2 = 0x7C; //
TCCR2 = (1<<WGM21)|(1<<CS22)|(1<<CS20); // CTC 8M/128
TIMSK = 0x80;
}
interrupt [TIM2_COMP] void timer2_isr(void) //2ms
{
static u16 Time2Count=0;
Time2Count++;
Key_Scan();
if(Time2Count%50 == 0) //100ms 计算一次速度,进行一次PID
{
gStruMotor.SpeedUpdateFlag = TRUE; // 更新速度标志
gStruMotor.RealPulse = TCNT0;
TCNT0 = 0;
gStruMotor.TimeBuff[gStruMotor.PulseCnt] = gStruMotor.RealPulse;
gStruMotor.PulseCnt++;
if(gStruMotor.PulseCnt >= 10)
{
gStruMotor.PulseCnt = 0;
}
}
if(Time2Count%250 == 0) //500ms
{
gStruLCD.MotorRealSpeedUpdate = TRUE; 更新显示
gStruLCD.Flash = ~gStruLCD.Flash;
}
}
速度更新
void Motor_Event(void)
{
u32 i,temp=0;
WatchDogFeed();
if(gStruMotor.SpeedUpdateFlag == TRUE) // 有速度更新
{
gStruMotor.SpeedUpdateFlag = FALSE;
for(i=0;i<10;i++)
{
temp += (u32)gStruMotor.TimeBuff; // 10次计数叠加
}
gStruMotor.SpeedTemp[0] = (u16)(temp*10);//temp*60*10/10*PHASE_SENSE_SELECT,PHASE_SENSE_SELECT=6(电机一圈6个脉冲)
if(gStruMotor.Run == TRUE)
{
pwm = Motor_PID(gStruMotor.DesSpeed,gStruMotor.SpeedTemp[0]);
if(pwm>4000)pwm=4000;
else if(pwm<=0)pwm=0;
OCR1AH = pwm>>8; // 计算得到的PWM值,改变占空比
OCR1AL = pwm&0xff;
}
temp = gStruMotor.SpeedTemp[0];
for(i=9; i>0; i--)
{
gStruMotor.SpeedTemp = gStruMotor.SpeedTemp[i-1];
temp += (u32)gStruMotor.SpeedTemp;
}
gStruMotor.CurSpeed = (u16)(temp/10); // 10次速度的平均
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|