Здравствуйте, господа форумчане)В который раз обращаюсь к вам за помощью надеюсь и сейчас дадите мне ценные советы и указания)От меня требуется сделать тахометр, снимающий обороты с вала двигателя. Технически это реализовано так:
есть декодер(на валу дв), подсоединееный к PORTA микроконтроллера Atm8515. так же к этому мк подключен дисплей(PORTC).
Т.к. max обороты двигателя=7200 об/мин, я решил, что таймер должен опрашивать декодер каждые 0,005 сек.
Далее вместе с Wizard'ом) написал такой код:
.....
bit nov_ugol;
char lcd_buf[35];
unsigned char rd_port,ugol,pred_ugol,n;
//unsigned int ug_sum;
float ug_sum;
float skor;
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Place your code here
//PORTA=PORTA+30;
rd_port=PINA;
nov_ugol=1;
TCNT1H=0x00;
TCNT1L=0x00;
}
.......
// Timer/Counter 1 initialization
// Clock source: System Clock
//500000khz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=2500;
.......
while (1)
{
if (nov_ugol==1)
{
n++;
pred_ugol=ugol;
ugol=rd_port;
if (ugol<pred_ugol){
ug_sum=ug_sum+ugol*1.4+(360-pred_ugol*1.4);//декодер передает в
} //8 битном формате. т.е. 360/255=1.4
else{
ug_sum=ug_sum+(ugol-pred_ugol)*1.4;
};
if (n==101) {
ug_sum=ug_sum*120; //т.е перевели из "градусов за 0,5сек" в
// градусов в минуту
skor=ug_sum/360;//посчитали оборотов в минуту
ug_sum=0;
n=0;
lcd_gotoxy(0,0);
sprintf(lcd_buf,"%.0f",skor);
lcd_puts(lcd_buf);
sprintf(lcd_buf,"%f",0);
};//if2
nov_ugol=0;
};//if
....
Прошивку проэмулировал в VMlab. Для этого я в прерывании таймера сам изменял PORTA и тут же мерил "изменившийся" угол(закомментированная строчка в обработчике прерывания). По моим расчетам такое изменение PORTA будет при 1400 об/мин. В эмуляторе показывает 1420 или 1438( эти значения чередуются). Никак не разберусь с чем это связанно. На основе данных с этого тахометра будет проверяться точность системы управления.т.е. такая ошибка недопустима. Буду признателен, если поможете разобраться