Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

Подсчет оборотов двигателя на ATmega 48

13.05.2014, 12:55. Показов 11195. Ответов 46
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Требуется сосчитать обороты ДВС и вывести на экран. Для этого я решил присобачить схему простейшего стробоскопа (pdf вложение) к микроконтроллеру ATmega48, работает на частоте 1 МГц. То что получилось, видно на схеме, и оно не работает. Помогите разобраться в чем тут проблема? Может импульс настолько короткий, что МК не успевает запустить прерывание?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define F_CPU 1000000UL
 
#include <avr/io.h>
#include <avr/eeprom.h>
#include <util/delay.h>
#include <stdlib.h>
#include <avr/interrupt.h>
 
#include "def.h"
#include "lcd_library/lcd.h"
 
uint32_t rpm = 0;
 
ISR(INT1_vect)
{
    rpm++;
}
 
// тут еще код, для других задач, он пропущен
 
int main(void) {
    // настройка дисплея
    lcd_init();
 
    // настройка прерываний
    interrupt_init();
 
    char str[10];
 
while(1){
 
        // prints counter value;
        lcd_set_cursor(1, 0);
        itoa(rpm * 60, str, 10);
        rpm = 0;
        lcd_write_str(str);
 
        delay(1000);
    }
 
    return 0;
}
 
void interrupt_init(void)
{
    SREG |= 0b10000000;     // global interrupts enable
    EICRA |= 0b00001100;     // enable INT1 interrupt
    EIMSK |= 0b00000010;
}
Программная часть точно выполнена правильно, если просто замыкать VCC на INT1, прерывание выполняется. А вот при пробе на двигателе не выполняется. Датчик на схеме представляет собой провод, намотанный на провод ВВ двс. Стробоскоп собранный по схеме из файла так же есть и работает, светодиод мигает как положено.
Миниатюры
Подсчет оборотов двигателя на ATmega 48  
Вложения
Тип файла: pdf стробоскоп.pdf (186.9 Кб, 37 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2014, 12:55
Ответы с готовыми решениями:

понижение оборотов двигателя
есть двигатель 5В 0,4А. допустим я хочу снизить его обороты на 30%. Считаем: мощность двигателя...

Регулятор оборотов бесколлекторного двигателя
Подкиньте пожалуйста схему регулятора оборотов(ESC) под авиамодельный бесколлекторник. Буду...

ПИД - регулятор оборотов двигателя
Здравствуйте, пытаюсь реализовать ПИД - регулятор двигателя постоянного тока. Управление...

Вывести индикацию оборотов вала двигателя
Доброго времени суток! Товарищи ну помогите делетанту. Имею электродвигатель 5.5 квт к нему...

Стабилизация оборотов DC двигателя 300W 24-52V
Вобщем есть шпиндель DC 300W от 24 до 52V напряжение питания. Посоветуйте схему стабилизации...

46
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
16.06.2014, 16:44 41
Author24 — интернет-сервис помощи студентам
sserg_ey, ему уже также писали, что этот алго неточный. Вы и сами, наверное, увидите, что шаг приращения результата в предложенном вами варианте - 3000об/мин. Многовато погрешности, как по мне.
При отлаженном (мною описанном чуть выше) алгоритме удавалось получить точность ~0,1%.

ЗЫ: напомню: предлагается считать с помощью таймера время, за которое произойдет определенное количество импульсов.
0
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
16.06.2014, 17:22  [ТС] 42
Voland_, ваш вариант интересен, но вы писали, что требуется отсутствие других внешних прерываний. у меня же есть прерывание для подсчета оборота колеса, чтобы вычислить скорость. Ну и точность 0.1% не требуется, это же не станок какой нибудь. Тут одну секунду одни обороты, затем уже совсем другие. Аналоговый индикатор был бы предпочтительнее конечно, но боюсь не реализуемо для меня. Да и обороты же не строго постоянны, они плавают, тем более двигатель карбюраторный. За секунду на холостых разброс может быть как раз 60 оборотов (сужу по показаниям бортового компьютера автомобиля с инжекторным двигателем), так что моя погрешность не так уж и критична.
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
16.06.2014, 23:39 43
Цитата Сообщение от [WRG] Посмотреть сообщение
что требуется отсутствие других внешних прерываний
очевидно, я неправильно акцентировал на этом внимание. Прерывания раз в 10мс не являются критичными, и в 1мс - в принципе, тоже. Особенно, если в них выполняется с десяток тактов задачи + 12 тактов - вход/выход из прерывания. Но наступает некий критичный момент, когда внешних прерываний может появиться слишком много, и тогда проц просто не будет справляться и почти всегда "жить" в прерываниях, не выполняя главный поток. В вашей задаче прекрасно все получится и по моему методу.
Идея примерно такая:
- внешнее прерывание:
1) Проверяем флаг старта замера. Если это первый импульс - обнуляем таймер 0 и запускаем его на счет.
Запускаем также таймер 2 с прерыванием через 200мкс.
Отключаем внешнее прерывание.
Инкриминируем счетчик EXTCNT внешних прерываний.
Если счетчик EXTCNT==10 (например):
сбрасываем флаг режима замеров,
выключаем прерывание по таймеру 2.
И сохраняем значение таймера 0 в переменную TIME.

Прерывание таймера 2: (алгоритм фильтра дребезга контактов)
выключаем таймер 2.
включаем внешнее прерывание

в главном потоке остается включать внешнее прерывание когда требуется замер и ожидать, когда сам установится, а потом сам сбросится флаг замеров.
В итоге вы получите данные EXTCNT=10 и TIME.
Считаем: один импульс у нас происходит за время t = TIME/EXTCNT/freq0. где freq0 - частота таймера 0. Соответственно, частота импульсов - f= 1/t = EXTCNT*freq0/TIME. Результат будет в херцах. Думаю, в об/мины переведете самостоятельно.

Добавлено через 2 минуты
...да, чем выше частота таймера 0, тем выше будет точность. Но... необходимо помнить о возможном переполнении этого таймера (за время импульсов EXTCNT), и это учитывать в расчетах.
1
53 / 53 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
17.06.2014, 13:36  [ТС] 44
Voland_, попробую сегодня вечером реализовать. к сожалению, запорол один датчик Холла когда пробовал, его намотало на вал вместе с проводом и раскрошило. думаю стоит вытравить небольшую платку для датчика (благо есть один запасной), и прикрутить ее возле магнита генератора, конструкция генератора позволяет, фото есть выше в треде. а провод прицепить например с помощью разъема WF-03MR.
0
12 / 12 / 0
Регистрация: 05.11.2011
Сообщений: 31
17.06.2014, 15:55 45
Я бы сделал есче проще-

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define CORE_FREQ          1000000.0
 
u16 T1C0, T1C1;
u16 rmp;
u8 Start=1;
int main()
{
MCUCR|= 1<<2;  //   INT0 - Any logical change
GICR|=1<<6;      //   INT0 - Enable
TCCR1B|=1<<1;  //   T1 - Start No prescaling
sei();
while(1)
  {
      rmp= (CORE_FREQ/(T1C0 + T1C1))*60;
  }
}
 
ISR(INT0_vect)
{
  static u8 CurrentHalfPeriod=0;
  if(Start)
    {
       Start=0;
       TCNT1=0;
       return;
    }
   if(CurrentHalfPeriod)
    {
       T1C1= TCNT1;
       TCNT1=0;
       CurrentHalfPeriod=0;
       return;
    }
   T1C0= TCNT1;
   TCNT1=0
   CurrentHalfPeriod=1;
}
На холостых ~900 об\мин по расчетам таймер успеет за половину периода сосчитать до 33000.
Но это все при условии, что на INT0 - заведен сигнал с цифрового униполярного датчика Холла!
PS программу не проверял, но должна работать.
1
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
17.06.2014, 22:07 46
sserg_ey, можно. Просто разброс данных от замера к замеру будет весьма внушительным. Ибо джиттеры не дремлют, да и "дребезги" вы не убираете...
0
12 / 12 / 0
Регистрация: 05.11.2011
Сообщений: 31
17.06.2014, 23:06 47
По идеи, датчик холла сеет все не поперечные поля, плюс выдает чистый меандр. то есть, если правильно расположить датчик, развести плату, снабдить ее хорошим фильтром по питанию. Счастье наступит.
0
17.06.2014, 23:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2014, 23:06
Помогаю со студенческими работами здесь

Регулировка оборотов двигателя на 220 вольт
Есть задача с помощью ардуино регулировать обороты двигателя 220 вольт. Все драйвера которые...

Датчик для контроля оборотов двигателя
Прошу помочь советом, необходимо выбрать и установить датчик для контроля оборотов двигателя от 0...

Регулятор оборотов DC двигателя 220В [на основе U2010B]
Добрый день Есть микросхема U2010B и схема на её основе: ...

регулятор оборотов двигателя 12в плюс стабелизация
подскажите пожалуйста (в эалектронике не селен но транзистор от стабелизатора и тп отличить смогу)...

Стабилизация оборотов для двигателя ~220В, 350Вт
Добрый день Возникла задачка: - есть двигатель: ~220В, 350 Вт Нужно придумать для него...

Выключение двигателя через определенное количество оборотов
PIC 16f877. Двигатель с датчиком кол-ва оборотов. Выключить двигатель через 2 оборота. Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru