|
Дополнение для радиоаппаратуры 2.4GHz |
|
|
|
Mar 25 2012, 15:42
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 12-10-11
Пользователь №: 67 694

|
Добрый день. Разрабатываю дополнение для радиоаппаратуры. Вот кое-что написал прошу Ваших комментариев, по алгоритму, организации кода, что можно улучшить. Код /** Задача: Необходимо управлять коллекторным двигателем по средствам ШИМ. Двигатель должен начинать движение с ускорением. Управление должно происходить в зависимости от входных сигналов. Входы: 1. Основной сигнал - прямоугольные импульсы амплитудой 5В, длительностью 20 мС, вехняя часть 1000 - 2000 мкС. 2. Два дискретных датчика - верхнее и нижнее положение. Выходы: Два выхода процессора, их комбинации управляют двигателем. Вверх - по ч.с., вниз против ч.с. |--------------------------------------------------------| | |Стоит |Вверх |Вниз |Зафиксирован | |--------------------------------------------------------| |Выход1 | 0 1 0 1 | |--------------------------------------------------------| |Выход2 | 0 0 1 1 | |--------------------------------------------------------| */
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "AE_Util.h"
#define PULSE_PIN PIND #define PULSE_PPIN PD2 #define PULSE_MID_WIDTH 188// Средняя длительность импульса 1500/8 = 188. #define PULSE_WIDTH_TOLER 5 // Допуск по ширине импульса #define PULSE_QUANTITY 10 // Количество анализируемых импульсов (0...255)
#define MOT_DDR DDRD #define MOT_PORT PORTD #define MOT_PIN1 PD4 #define MOT_PIN2 PD5 #define MOT_UP sbi(MOT_PORT, MOT_PIN1); cbi(MOT_PORT, MOT_PIN2) #define MOT_DOWN cbi(MOT_PORT, MOT_PIN1); sbi(MOT_PORT, MOT_PIN2) #define MOT_STANDBY cbi(MOT_PORT, MOT_PIN1); cbi(MOT_PORT, MOT_PIN2)
#define SEN_PIN PINA #define SEN_UP_PIN PA0 #define SEN_DOWN_PIN PA1
enum {S_NO, S_UP, S_DOWN, S_BOTH};
// Глобальные переменные volatile u8 g_abPUW[PULSE_QUANTITY];// Массив ширин верхней части импульса 1 == 8 мкС. volatile u8 g_bPulNum;
// Глобальные функции u8 Measuring(); u8 GetSen();
ISR(INT0_vect) { if(PULSE_PIN & (1 << PULSE_PPIN)) // Начало верхней части { TCCR0=0x03; TCNT0=0x00; } else // Конец верхней части { if(TCCR0 != 0)// Только если таймер предварительно был запущен, чтобы замеры делать с начала импульса { g_abPUW[g_bPulNum++] = TCNT0; TCCR0=0x00; }
} }
int main(void) { sbi(MOT_DDR, MOT_PIN1); sbi(MOT_DDR, MOT_PIN2);
// Чтобы входные импульсы стабилизировались _delay_ms(500); while(1) { if(GetSen() != S_DOWN) { MOT_DOWN; while(GetSen() != S_DOWN); MOT_STANDBY; } else { u8 bTol, bMid; do { bMid = Measuring(); if(bMid <= PULSE_MID_WIDTH) { bTol = PULSE_MID_WIDTH - bMid; } else { bTol = bMid - PULSE_MID_WIDTH; } }while(bTol < PULSE_WIDTH_TOLER); MOT_UP; while(GetSen() != S_UP); MOT_STANDBY; _delay_ms(500); MOT_DOWN; while(GetSen() != S_DOWN); MOT_STANDBY; } }
return 0; }
u8 Measuring() { g_bPulNum = 0; TCCR0=0x00;// Таймер выключен sbi(GICR, INT0);// Разрешаем прерывание INT0 cbi(MCUCR, ISC01);// Прерывание будет происходить при любом изменении уровня на INT0 sbi(MCUCR, ISC00); sbi(GIFR, INTF0);// Сбросить прерывание INT0 sei();// Глобальное разрешение прерываний
while(g_bPulNum < PULSE_QUANTITY);// Ожидаем необходимое количество импульсов
cli(); cbi(GICR, INT0); TCCR0 = 0x00;
// Вычисляем среднее значение u8 b; int iMid = 0; for(b = 0; b < PULSE_QUANTITY; b++) { iMid += g_abPUW[b]; } iMid /= PULSE_QUANTITY;
return iMid; }
u8 GetSen() { volatile u8 bRes = SEN_PIN & (1 << SEN_DOWN_PIN); bRes |= (SEN_PIN & (1 << SEN_UP_PIN)); return bRes; }
|
|
|
|
|
 |
Ответов
|
Mar 27 2012, 18:27
|

Местный
  
Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658

|
По поводу Код while(GetSen() != S_DOWN); может быть не совсем то что у вас, покажу на примере: Код while(flag_ms != 2); 32: 80 91 60 00 lds r24, 0x0060 36: 82 30 cpi r24, 0x02; 2 38: 19 f4 brne .+6 ; 0x40 <__SREG__+0x1> TCNT0=10; 3a: 8a e0 ldi r24, 0x0A; 10 3c: 82 bf out 0x32, r24; 50 3e: 08 95 ret 40: ff cf rjmp .-2 ; 0x40 <__SREG__+0x1>
|
|
|
|
|
Mar 28 2012, 17:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(MaxiMuz @ Mar 28 2012, 00:27)  По поводу Код while(GetSen() != S_DOWN); может быть не совсем то что у вас, покажу на примере: Может уже хватит свои косяки выдавать за кривизну компилятора? У вас просто нет квалификатора volatile перед переменной flag_ms. Цитата(e-leks @ Mar 27 2012, 22:55)  Если возможно приведите пример Вашего кода касаюшийся обращения к порту. PORTA = 12;  Цитата(e-leks @ Mar 27 2012, 22:55)  В теле main() запись типа PORTA выглядит как то по-детски? Нет? Нет, не по-детски. Ещё раз повторю - если надо записать что-то в порт, то надо просто взять и записать. Все другие варианты - это усложнение. Усложнять нужно только по необходимости, например, в случае двух разных аппаратных платформ. Цитата(e-leks @ Mar 27 2012, 22:55)  Можно микропример? Ну типа то же самое, что с макросами, но с функциями: camen1.h: Код inline void motor_up() { PORTA |= MOTOR_PIN; } inline void motor_down() { PORTA &= ~MOTOR_PIN; } camen2.h: Код inline void motor_up() { spi_write(spi_read() | MOTOR_PIN); } inline void motor_down() { spi_write(spi_read() & ~MOTOR_PIN); } в главном коде: Код #ifdef CAMEN1 #include "camen1.h" #else #include "camen2.h" #endif ... motor_up(); motor_down();
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
e-leks Дополнение для радиоаппаратуры 2.4GHz Mar 25 2012, 15:42 kovigor Цитата(e-leks @ Mar 25 2012, 19:42) ... Mar 25 2012, 17:34 e-leks Цитата(kovigor @ Mar 25 2012, 21:34) ...к... Mar 25 2012, 18:22  AHTOXA Ошибка вроде всего одна: "по средствам ШИМ... Mar 25 2012, 21:26 MaxiMuz Цитата(e-leks @ Mar 25 2012, 18:42) ... Mar 26 2012, 11:26 e-leks Постараюсь конкретизировать вопросы.
1. С/С++ явля... Mar 26 2012, 16:24 kovigor Цитата(e-leks @ Mar 26 2012, 19:24) ... Mar 26 2012, 17:59  e-leks Цитата(kovigor @ Mar 26 2012, 21:59) ...в... Mar 26 2012, 18:23   kovigor Цитата(e-leks @ Mar 26 2012, 21:23) ... Mar 26 2012, 18:33    e-leks Цитата(kovigor @ Mar 26 2012, 22:33) Допу... Mar 27 2012, 16:55 AHTOXA Цитата(e-leks @ Mar 26 2012, 22:24) ... Mar 26 2012, 18:34 MaxiMuz Судя по описанию и самой программе , управление ск... Mar 27 2012, 11:45 kovigor Цитата(MaxiMuz @ Mar 27 2012, 14:45) а к ... Mar 27 2012, 13:03 MaxiMuz e-leks не указал каким компилятором пользуется, но... Mar 27 2012, 15:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|