nothing101
27-03-2011, 12:45 PM
Các bạn cho mình hỏi mình định dùng timer 0 ở chế độ counter để đếm xung encoder đưa về, timer 1 để tạo khoảng thời gian 10ms là tính tốc độ một lần như thế này có được không.Sau khi tính tốc độ mình muốn truyền lên máy tính nhưng chưa biết làm như thế nào và hiển thị tốc độ tức thời lên LCD khi có yêu cầu từ nút nhấn.Các bạn xem giúp mình tính toán có đúng không với.Mình mới lập trình được cho 2 cái timer thôi.Biến so_xung_encoder là mình đưa vào do chưa mua động cơ không biết encoder đếm được bao nhiêu xung trên một vòng
#include "def_877a.h"
#use delay(clock=20000000)
int16 count,so_vong_phut,int_count1;
int8 So_xung_Encoder
#define INTS_PER_SECOND1 2
#int_rtcc // Ngat Timer 0
void Timer0_isr() // Dem so xung tu encoder
{
count++;
}
#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer1_isr() { // Ham duoc goi khi Timer1 tran (65536->60536)
// 2 lan tran moi tinh toc do mot lan
// thoi gian tran la 4*(prescaler=1)*(65536-60536)*(count=2)/4/10^6=10ms
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
so_vong_phut= (count*255 + get_timer0())/Soxung_Encoder*60/(10*10^-3);
count = 0;
set_timer0(0);
}
}
void init()
{
int_count1 = INTS_PER_SECOND1;
setup_timer_0 (RTCC_DIV_256|RTCC_EXT_H_TO_L);
// Timer0 is Counter co thoi gian tran la 255*256/20/10^6=13.1ms>10ms
set_timer0(0);// timer 1 dem tu 0
set_timer1(60536);// Timer 1 dem tu 60536
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Timer1 is Timer
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
}
#include "def_877a.h"
#use delay(clock=20000000)
int16 count,so_vong_phut,int_count1;
int8 So_xung_Encoder
#define INTS_PER_SECOND1 2
#int_rtcc // Ngat Timer 0
void Timer0_isr() // Dem so xung tu encoder
{
count++;
}
#INT_TIMER1 // Chuong trinh ngat Timer 1
void Timer1_isr() { // Ham duoc goi khi Timer1 tran (65536->60536)
// 2 lan tran moi tinh toc do mot lan
// thoi gian tran la 4*(prescaler=1)*(65536-60536)*(count=2)/4/10^6=10ms
if(--int_count1==0)
{
int_count1 = INTS_PER_SECOND1;
so_vong_phut= (count*255 + get_timer0())/Soxung_Encoder*60/(10*10^-3);
count = 0;
set_timer0(0);
}
}
void init()
{
int_count1 = INTS_PER_SECOND1;
setup_timer_0 (RTCC_DIV_256|RTCC_EXT_H_TO_L);
// Timer0 is Counter co thoi gian tran la 255*256/20/10^6=13.1ms>10ms
set_timer0(0);// timer 1 dem tu 0
set_timer1(60536);// Timer 1 dem tu 60536
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // Timer1 is Timer
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
count = 0;
}