Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Электронный тахометр

Отправлено nepeLL 21 мая 2009, г. 13:59


Здравствуйте, господа форумчане)В который раз обращаюсь к вам за помощью надеюсь и сейчас дадите мне ценные советы и указания)От меня требуется сделать тахометр, снимающий обороты с вала двигателя. Технически это реализовано так:
есть декодер(на валу дв), подсоединееный к 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( эти значения чередуются). Никак не разберусь с чем это связанно. На основе данных с этого тахометра будет проверяться точность системы управления.т.е. такая ошибка недопустима. Буду признателен, если поможете разобраться


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 38:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru