|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 11 15, 11:05. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Apsisukimu skaitiklis
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 05, 11:57 |
|
|
|
Sveiki,
Tikslas skaiciuoti apsisukimus RPM/min (max 500 rpm/min).
Skaiciavimo formule (http://radiokot.ru/forum/viewtopic.php?t=24703&highlight=%EE%E1%EE%F0%EE%F2%EE%E2)
S=(60*Fo*Nx*k)/nox ,
где
S - скорость вращения (об/мин)
Fo - тактовая частота контроллера (Гц)
Nx - целое число периодов измеряемой скорости
k - коеф. пропорциональности (сколько импульсов за 1 оборот)
nox - целое число периодов тактовой частоты микроконтролера
Atmega16 + LCD, simuliacija ant proteuso. Deja LCD nieko nerodo. Gal neteisingai vykdau isvedima i ekrana.
Kodas paimtas (http://forum.cxem.net/index.php?showtopic=52397&st=40):
Gal turite savo pavyzdi mokymuisi?
8mhz kvarcas
#include <mega16.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <stdio.h>
unsigned char lcd_buffer [33];
unsigned long int counter; // количество тиков между прерываниями INT0 для расчетов
unsigned long int counter_timer; // количество тиков между прерываниями INT0 для таймера
unsigned int c_tacho=0; // // расчитанное количество числа оборотов
interrupt [EXT_INT0] void ext_int0_isr(void) //прерывание по появлению импульса на INT0
{
counter=counter_timer;
counter_timer=0; //обнуляем количество пройденных импульсов timer2
c_tacho=60/(counter*0.000001); // 0.000001 - период в секундах для частоты таймера2 1000,000 kHz
}
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Place your code here
counter_timer++;
}
// Declare your global variables here
void tacho_lcd_view()
{
lcd_gotoxy(0,0);
sprintf(lcd_buffer,"%4d ob/min",c_tacho); //
lcd_puts(lcd_buffer);//выводим
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// 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: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000,000 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x02;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
tacho_lcd_view();
};
} |
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 05, 12:05 |
|
|
|
o is viso ka nors isveda LCD ar ne? Parasyk paprasta testa, kad patikrintum prijungimus. |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 05, 12:20 |
|
|
|
Irasius:
// LCD module initialization
lcd_init(16);
lcd_clear(); //isvalyti ekrana
lcd_putsf(" skaitiklis ");
delay_ms(4000); // rodyti 4sek
lcd_clear();
rodo ekrane bet ilgai palaukus issijungia uzrasas "skaitiklis" (o ne 4 sek.). Kazkas negerai, tarsi viskas suletintai. |
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 06, 17:44 |
|
|
|
na is kur tokia beviltiska programa istraukiai. Permetes akim pamaciau, kad cia lygtais skaiciuoja isorinius pertrauktis.
Na schema gal galetum ideti kaip cia viskas atrodo, nes is programos sunkiai eina spresti. |
|
_________________ Diplomas tik etikete ant konservų dėžutes. O kas slepiasi dėžutėje neaišku. |
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 06, 20:13 |
|
|
|
Nelabai randu kaip cia prikabinti paveiksliuka
Shema paparsta i Atmega16 porta C pajungtas LCD (PC0-RS, PC1-RW, PC-E, PC4-D4...PC7-D7), o isoriniai impulsia paduodami i INT0 (PD2).
Aiskinantis principo esme, kiek supratau, tokia (nagrinejau kita pavyzdi su Atiny2313 is http://www.hardlock.org.ua/mc/tiny/tahometr/index.html ):
Timeris 1 - 16Bitu. Kvarcas 4Mhz : 64 = 62,5Khz
OCR1A += 6250;
skaiciuoja ir ivykdo pertraukimus
Tada isorinio pertraukimo INT0 metu vykdomas skaiciavimas
wFlashCnt++; //wFlashCnt = Skaitiklis suveikiancio daviklio
kur:
1Tmp = (62500L * 60L * (long)wFlashCnt);
1Tmp /= ((wTimerOvfCnt << 8 ) + TCNT0); // wTimerOvfCnt = Skaitiklis timerio perpildymo
1Tmp /= byBladeCnt; //byBladeCnt=impulsu sk. vieno apsisukimo metu
wRpm = lTmp;
Reikia pabandyti viska sudelioti ir isbandyti perasius is naujo koda |
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 02 08, 08:39 |
|
|
|
jei procesoriukas juda labai suletintai, tai pzr jo taktinis dazni. Koks nustatytas? |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 04 02, 22:11 |
|
|
|
Gal kam bus idmomus perrasytas RPM matuoklis Atmega8 + LCD displejus pagal: http://www.hardlock.org.ua/mc/tiny/tahometr/index.html
Su Proteusu veikia. Kam bus idomu galiu asmeniskai persiusti projekta, o tai tik menesis paiesku ir skaitymo.
Gal atsiras entuziastu padaryti vejo greicio matuokliu?
#define TRUE (!FALSE)
#define FALSE 0
#define BYTE unsigned char
#define WORD unsigned short int
#define BOOLEAN char
#define TIMER_OVF_ENOUGHT 49
#define NO_PULSES_INTERVAL 200
#define LED_delay 250
//#define Light_delay 2500
//#define Anode
//#define Cathode
#define CNT_100_MS 6250
#define byBladeCnt 2 //1- две катушки, 2 - одна катушка, 4 - мотоцикл...
#define UpCount 4 // +1 = количество пропусков (0,1S) до обновления
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
BOOLEAN btTimerOn; // TRUE - таймер запущен, FALSE - остановлен
BOOLEAN btTimeUpdate; // = 1, когда нужно обновить время на дисплее
WORD wTime; // Время, которое показывает секундомер (в десятых секунды)
BYTE byTcnt; // счетчик десятых секунд
BYTE byDisplayRefreshCnt; //
BYTE byDisplay[7]; // буфер данных, для вывода на экран mano dadetas
void ShowDisplayData(void); // Вывод экранного буфера
void PrepareRpmData(WORD wRpm);
BOOLEAN btDisplayUpdate; // = TRUE, если пришло время обновить дисплей
WORD wLockedRpm;
WORD wRpm; // Скорость вращения ротора (об/мин)
//BOOLEAN btRpmUpdate; // = 1, когда измеряно новое значение оборотов
WORD wTimerOvfCnt; // Счетчик переполнений таймера (нужен для
// увеличения разрядности
WORD wFlashCnt; // Счетчик срабатываний датчика прохождения допасти
BOOLEAN btFirstLowRateFlash; // FALSE - если отсчет периода еще не начался
// (датчик ни разу не сработал)
/************************************************************************\
Преобразование скорости мотора и количества лопастей
в данные экранного буфера
Вход: wRpm - обороты ротора, byBladeCnt - количество лопастей
Выход: -
\************************************************************************/
void PrepareRpmData(WORD wRpm)
{
BYTE i;
WORD R;
R = wRpm;
byDisplay[3] = wRpm % 10;
wRpm /= 1;
if (byDisplay[3] > 4) //округляем
{
wRpm++;
R += 10;
}
byDisplay[3] = 0;
// Первые 4 цифр - обороты двигателя
for(i=0; i<4; i++)
{
byDisplay[3-i] = wRpm % 10 + 48;
wRpm /= 10;
}
if (R < 10)
{
byDisplay[0] = 10;
byDisplay[1] = 10;
byDisplay[2] = 10;
goto exit;
}
if ((R >= 10) & (R <100))
{
byDisplay[0] = 1;
byDisplay[1] = 1;
goto exit;
}
if ((R >= 100) & (R <1000))
{
byDisplay[0] = 1;
goto exit;
}
exit:
}
/************************************************************************\
Вывод экранного буфера на дисплей.
Вход: -
Выход: -
\************************************************************************/
void ShowDisplayData(void)
{
int i;
for(i=0; i<7; i++)//kiek skaiciu isvesti i eilutes desine puse
{
lcd_putchar(byDisplay[i]);
}
}
/**************************************************************************\
Обработка прерываний от OC1 (для отсчета импульсов 0.1 сек)
Вход: -
Выход: -
\**************************************************************************/
interrupt [TIM1_COMPA] void SYSTEM_TICK_interrupt(void)
{
// Вычисляем оммент следующего срабатывания таймера
OCR1A += CNT_100_MS;
// 3 раза в секунду перерисовываем дисплей,
// независимо от обстоятельств.
if( ++byDisplayRefreshCnt == UpCount )
{
byDisplayRefreshCnt = 0;
btDisplayUpdate = TRUE;
}
// Если секундомер запущен - инкрементируем его показания
if( btTimerOn )
{
if (++byTcnt == 10)
{
byTcnt = 0;
if( ++wTime == 60000)
wTime = 0;
}
}
}
/**************************************************************************\
Обработка прерываний от управляющих импульсов
Вход: -
Выход: -
\**************************************************************************/
interrupt [EXT_INT0] void RPM_PULSE_interrupt(void)
{
long lTmp;
GICR &= ~0x40; //GIMSK &= ~0x40; (INT0)
if(btFirstLowRateFlash)
{
// Первый импульс, сбрасываем счетчик периода и
// счетчик импульсов
wTimerOvfCnt = 0;
wFlashCnt = 0;
TCNT0 = 0;
TIFR = 0x01;//TIFR = 0x02; (TOV0)
TCCR0 = 0x03,//(CS01)(CS00) TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIMSK |= 0x01;//TIMSK |= 0x02; // Разрешаем прерывания от TMR0
btFirstLowRateFlash = FALSE;
}
else
{
wFlashCnt++;
// Проверяем, не пора ли закончить измерения
if( wTimerOvfCnt > TIMER_OVF_ENOUGHT )
{
TCCR0 = 0;//TCCR0B = 0; // Останавливаем TMR0
GICR &= ~01000000;//GIMSK &= 0x40; // Запрещаем прерывания от INT0
TIMSK &= ~ 0x01;//TIMSK &= ~0x02; // Запрещаем прерывания от TMR0
if(TIFR & 0x01)//(TIFR & 0x02) (TOV0)
wTimerOvfCnt++; // Учитываем возможность переполнения
lTmp = (62500L * 60L * (long)wFlashCnt);
lTmp /= ((wTimerOvfCnt << 8) + TCNT0);
lTmp /= byBladeCnt;
wRpm = lTmp;
// Перезапускаем измерения
btFirstLowRateFlash = TRUE;
wTimerOvfCnt = 0;
TCNT0 = 0;
TCCR0 =00000011,//(CS01)(CS00) TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz ))
TCNT0 = 0;
TIFR = 0x01;//TIFR = 0x02; (TOV0)
TIMSK |= 0x01;//TIMSK |= 0x02; // Разрешаем прерывания от TMR0 (TOIE0)
// GIFR = 0x40;
}
}
GIFR = 0x40;//01000000;//EIFR = 0x40; (INTF0)
GICR |= 0x40;//01000000;//GIMSK |= 0x40; (INT0)
}
/**************************************************************************\
Обработка переполнений TMR0 (добавляем к счетчику еще 8 разрядов)
Вход: -
Выход: -
\**************************************************************************/
interrupt [TIM0_OVF] void TIMER0_interrupt(void)
{
wTimerOvfCnt++;
// Если импульсов не было слишком долго, то показываем
// 0 оборотов и запускаем измерение заново
if( wTimerOvfCnt > NO_PULSES_INTERVAL )
{
wRpm = 0;
btFirstLowRateFlash = TRUE;
wTimerOvfCnt = 0;
}
}
/**************************************************************************\
Головная функция. Инициализация всех модулей. Цикл вызова рабочих
подпрограмм.
Вход: -
Выход: -
\**************************************************************************/
void main(void)
{
#asm("cli");
MCUCR = 0x00; // Запрещаем SLEEP, режимы прерывания пока не важны.
// В принципе, этого можно и не делать.
GICR = 0x00;//00000000;//GIMSK = 0x00; // Запрещаем внешние прерывания
GIFR = 0xFF;//11111111;//EIFR = 0xFF; // Очищаем флаги прерываний
TIMSK = 0x00; // Запрещаем прерывания от таймеров
TIFR = 0xFF; // Очищаем флаги прерываний
// Инициализируем модули
//time------------------------------------
btTimerOn = FALSE;
wTime = 0;
byTcnt = 0;
byDisplayRefreshCnt = 0;
btTimeUpdate = FALSE;
TCNT1 = 0;
TCCR1A = 0x00; // Отключаем управление выводом OC1 и PWM
TCCR1B = 0x03; // На таймер подается FCK через делитель на 64,
// шумодав отключен, никакого сброса нет
OCR1A = TCNT1 + CNT_100_MS;
TIFR |= 0x10;//TIFR |= 0x40; (OCF1A) // Сбрасываем флаг прерываний от Output-Compare
TIMSK |= 0x10;//00010000;//TIMSK |= 0x40; (OCIE1A) // Разрешаем прерывание от Output-Compare
//time------------------------------------
//rmp-------------------------------------
btFirstLowRateFlash = TRUE;
wRpm = 0;
// Разрешаем прервание INT1
GIFR = 0x40;//01000000;//EIFR = 0x40; (INTF0)
GICR |= 0x40;//01000000;//GIMSK |= 0x40;
MCUCR = 0x40;//0x02; // Настраиваем INT0 на спад, остальные биты не важны.
// Таймер запускаем сразу, чтобы проверять
// отсутствие сигнала
wTimerOvfCnt = 0;
TCNT0 = 0;
TCCR0 = 0x03;//00000011,//(CS01)(CS00) TCCR0B = 0x03; // FCK / 64 ( 62.5 KHz )
TCNT0 = 0;
TIMSK |= 0x01; //TIMSK |= 0x02; (TOIE0) // Разрешаем прерывания от TMR0
//rmp-------------------------------------
#asm("sei");
// LCD module initialization
lcd_init(16);
while(TRUE)
{
if (btDisplayUpdate)
{
wLockedRpm = wRpm;
btDisplayUpdate = FALSE;
}
#asm("sei");
lcd_clear();
lcd_gotoxy(0,0);
PrepareRpmData(wRpm);
byDisplay[0] = byDisplay[0];
byDisplay[1] = byDisplay[1];
byDisplay[2] = byDisplay[2];
byDisplay[3] = byDisplay[3];
byDisplay[4] = 'r';
byDisplay[5] = 'p';
byDisplay[6] = 'm';
ShowDisplayData();
}
} |
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 04 03, 10:18 |
|
|
|
galima ir paprasčiau padaryt su lcd, primityviai taip - pusvalandis darbo
Kodas: |
// IAR AVR ATmega16 8MHz
#define ENABLE_BIT_DEFINITIONS
#include <ioavr.h>
#include <intrinsics.h>
#include "delay.h"
#include "lcd.h"
unsigned int count;
//******************************************************
void IntToStr(unsigned int va){
int i,s;
char mas[5];
for(i=0; i<5; i++){
mas[4-i] = (va % 10)+48;
va = va / 10;
}
s = 0;
for(i=0; i<4; i++){
if(mas[i] != '0') break;
s++;
}
for(i=s; i<5; i++){
lcd_dat(mas[i]);
}
}
//******************************************************
#pragma vector=TIMER1_OVF_vect //pertraukimas kas 1s
__interrupt void timer1ovf(void){
lcd_cmd(0x88);
IntToStr(count);
count = 0;
TCNT1 = 34285;
}
//******************************************************
void main( void ){
DDRC = 0xFE;
sbi(PORTC,0); // portc.0 iej. pullup ij.
lcd_init();
lcd_line("aps/s: ",1,0);
TCCR1A = 0x00;
TCCR1B = 0x04; //prescal 256
TIMSK = 0x04; //TOIE1 en.
TCNT1 = 34285; //((65535 - 34285) * 256) * (1/8Mhz) = 1s
__enable_interrupt();
while(1){
while(bitas(PINC,0));
while(!bitas(PINC,0));
count++;
}
}
|
|
|
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 04 03, 10:59 |
|
|
|
Vienam mėnesis, kitam - pusvalandis. Viskas nuo žinių lygio priklauso... |
|
|
|
|
|
Apsisukimu skaitiklis |
Parašytas: 2010 04 04, 07:59 |
|
|
|
Dekui uz pavyzdi, vadinasi yra kur tobuleti.
Vienas gali prie kompo sedeti visa diena, o kitas dziaugsis jei valanda ras. Taip laikas ir bega...
Sekantis zingznis apjungti itampos, sroves matavima.
Kur rast info koks vejo greitis m/s butu lygus apsuku skaiciui? Galetu isskaiciuot vejo greiti pagal apsukas. |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
|
|