http://www.roboforum.ru/viewtopic.php?f=2&t=3295&st=0&sk=t&sd=a&start=15
с чего началось
пытаюсь собрать платформу (машинку) на радиоуправлении с четырьмя моторами, кодер и декодер собрал
декодер выдает (проверено осциллографом) импульсы от 1 до 2мс в зависимости от положения рычажка джойстика ..
также собрал Н-мосты на полевиках, на мосте есть выход А (крутить в лево) и Б (вправо) ...
над приемником и передатчиком сейчас работаю ...
теперь вопросы:
1. для управления н-мостами нужен контроллер (на меге8 желательно) ... нужно чтобы этот контроллер считывал ДЛИТЕЛЬНОСТЬ ИМПУЛЬСА с декодера и реагировал след. образом
1мс - полный назад или вперед
.
. изменение скорости
.
1,5мс - стоп
.
. изминение скорости
.
2мс - полный назад или вперед
как регулировать ШИМ вроде понятно ... а вот как считывать длительность импульсов ... нет
вот ...
облазив весь google, конкретных примеров не нашел, но вроде разобрался сам ....
частота МК 8 MHz
- Код: Выделить всё • Развернуть
#include <mega8.h>
#include <stdio.h>
void main(void)
{
PORTC=0x00;
DDRC=0x02; // на С0 подаем импульс а с С1 читаем
TCCR0=0x00; // счетчик T0 остановлен
TCNT0=0x00;
//USART
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
while (1)
{
if (PINC.0) {
TCCR0=0x04; //запускаем счетчик с пределителем 256
while (PINC.0) { //пустой цикл пока на ноге С0 еденица
}
}
TCCR0=0x00; //останавливаем счетчик
if (TCNT0>0) {
printf("T0 = %d\r\n", TCNT0); //выводим на терминал T0
}
TCNT0=0x00; //обнуляем счетчик
};
}
получается
при 1мс TCNT = 31
при 2мс TCNT= 62
проверяем 31 * 256 *0,125мкс = 992 мкс или ~1мс
62 * 256 * 0,125 = 1984 мкс или ~2 мс
Добавлено спустя 10 минут 4 секунды:
вот тоже самое только используя внешнее прерывание INT0
- Код: Выделить всё • Развернуть
#include <mega8.h>
// Standard Input/Output functions
#include <stdio.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if (PIND.2) {
PORTC.1=1;
TCCR0=0x04;
while (PIND.2) {
}
}
PORTC.1=0;
TCCR0=0x00;
if (TCNT0>0) {
printf("T0 = %d\r\n", TCNT0);
TCNT0=0x00;
}
}
void main(void)
{
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x02;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x03;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
};
}
эмуляция делалась в протеусе 7.2 SP2 , попробовал на другом компе в версии 7.1 SP2 , запустилась, но работает не корректно.