Спидометр (тахометр) на микроконтроллере AVR. WinAVR (Часть1)

Просмотров: 30950Комментарии: 0
Электроника. СхемотехникаAVR.Начинающим

Обещался переделать спидометр под WinAVR, поэтому давайте начнем. Заодно эта статья будет примером работы с таймером в режиме захвата (настройку этого режима смотрите в Таймеры счетчики микроконтроллеров AVR). Здесь приведу пример программы, которая будет выводить на экран скорость движения (м/с) и пройденное расстояние (м). Итак, подключаем символьный дисплей к порту D, а на вход ICP будем подавать сигнал с нашего датчика. В Протеусе заменим этот датчик на генератор импульсов. Принцип измерения состоит в том чтобы посчитать время между импульсами на входе ICP микроконтроллера. И зная расстояние пройденное между импульсами сможем посчитать скорость. Приведу здесь полный код программы, так как она совсем небольшая, а в конце можно будет скачать проект в WinAVR. Здесь настроил таймер/счетчик так, чтобы он досчитывал до 16000 за 1с, т.е. максимальное время между импульсами будет равно 4с. Если за это время не придет импульс на ножку ICP, таймер/счетчик обнулится и начнет счет заново. Таким образом, зная до скольки счетчик досчитает за одну секунду мы можем посчитать время между импульсами, для этого разделим значение счетчика за 1с на значение счетчика между импульсами. Пройденное расстояние узнаем откалибровав наш прибор. 
Например, в случае велосипедного колеса откалибровать , значит выяснить расстояние, которое пройдет колесо за один оборот. Для калибровки мы будем подсчитывать количество импульсов с датчика на определенном расстоянии и затем высчитывать калибровочный коэффициент и будем использовать для этого внешние прерывания. Но так как пример работы с внешними прерываниями уже приводил (см. Внешние прерывания МК AVR), то чтобы не загромождать программу (это все таки пример работы таймера в режиме захвата) не будем здесь использовать калибровку, а просто присвоим конкретное значение этому коэффициенту. В общем хватит слов, давайте перейдем к программе.

//подключаем библиотеки
#include <iom8.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "lcd_lib.h"
//частота тактирования микроконтроллера
F_CPU 4000000
//определяем биты регистров
//TCCR1B
#define ICNC1 7
#define ICES1 6
#define CS12 2
#define CS11 1
#define CD10 0
//TIMSK
#define TICIE1 5//Прерывание по захвату TC1
#define TOIE1 2//Прерывание по переполнение TC1
//объявляем глобальные переменные
unsigned int temp=0;
unsigned int speed=0;
unsigned int Koeff=200;//значение калибровочного коэффициента в сантиметрах
unsigned long int Distance;
//прерывание по переполнению ТС1
ISR(TIMER1_OVF_vect)
{
//обнуляем значения
TCNT1 = 0;
speed=0;
}
//прерывание по захвату
ISR(TIMER1_CAPT_vect)
{
TCNT1 = 0;
temp=ICR1;//считываем значение регистра
if(temp!=0)
speed=((160000/temp)*Koeff)/100;//считаем скорость, делим на 100, чтобы перевести сантиметры в метры. 160000 вместо 16000, т.к. хочу учитывать и десятые скорости, а не только целое значение.
Distance+=Koeff;//увеличиваем расстояние на значение Koeff
}
int main()
{
//объявляем переменные и производим инициализацию
char buffer[16];
TCCR1A=0x00;
TCCR1B=(1<<ICNC1)|(1<<ICES1)|(1<<CS12);//clk/256
TIMSK = (1<<TICIE1)|(1<<TOIE1);
LCDinit();
sei();
while(1)
{
//В цикле выводим значения на экран
sprintf(buffer, "%i.%i %d", speed/10, speed, Distance/100);
LCDclr();
LCDGotoXY(0,0);
LCDstring(buffer, sizeof(buffer)-1);
_delay_ms(100);
}
return 0;
}

Думаю работа программы понятна из комментариев. Думаю не составит труда переделать эту программу для подсчета оборотов за минуту. Попробуйте сделатьsmile

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)