AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
11.09.2014, 00:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержка импульса
Сообщение от SAHA_T
|
чуть позже займусь программой
|
Я бы порекомендовал сначала заняться алгоритмом...
|
|
|
Сказали "Спасибо" omercury
|
|
|
11.09.2014, 00:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержка импульса
Сообщение от Yurkin2014
|
По 100 не годится: будет слишком большая ошибка установки УОЗ.
......
Вот, в таблице видно, шаг по оборотам непостоянный:
|
Ага, сначала хотел поругаться, а потом дочитал пост.
Динамический шаг, это правильно.
Сообщение от Yurkin2014
|
Поэтому предлагаю плюнуть на частоту оборотов и пользовать только длительность оборотов.
|
Предлагал уже, но наш парень горячий - хочет сразу кодить.
|
|
|
Сказали "Спасибо" omercury
|
|
|
11.09.2014, 02:53
|
|
Прописка
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Задержка импульса
Вот еще один хороший человек
ага, достучался я до Вас
omercury, Очень рад Вас видеть
Дак а где же эти внешние прерывания находятся GIMSK|=0x40;MCUCR=0x03; EIFR=0x40; я так понимаю что в таймере им делать нечего. Даже в книге Белова 2 слова про MCUCR(фронты) а остальное не понятно.
*Предлагал уже, но наш парень горячий - хочет сразу кодить.* - я просто учусь, и много чего не понимаю
Последний раз редактировалось SAHA_T; 11.09.2014 в 03:07.
|
|
|
|
11.09.2014, 07:35
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Задержка импульса
Сообщение от omercury
|
Динамический шаг, это правильно.
|
Там есть еще один нюанс.
Регулировочная характеристика центробежного регулятора не зря имеет излом. Это вызвано тем, что на малых углах изменение скорости поршня небольшие, а вот при увеличении угла опережения скорость поршня меняется быстрее. Другими словами, сразу после импульса поршень бежит быстро к ВМТ, потом скорость уменьшается (синусоида). Судя по двум пружинам в центробежнике, отмахиваться от этого нельзя (иначе его бы упростили).
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
11.09.2014, 11:52
|
|
Прописка
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Задержка импульса
Дак в таблице и будет видно длительность импульса на определенном обороте
22 5632 10653,40909
23 5888 10190,21739
24 6144 9765,625
25 6400 9375
26 6656 9014,423077
27 6912 8680,555556
28 7168 8370,535714
29 7424 8081,896552
30 7680 7812,5
31 7936 7560,483871
32 8192 7324,21875
и эту длительность можно изменить в таблице, под себя, таким образом компенсировать некоторые огрехи вызванные на определенных оборотах
Последний раз редактировалось SAHA_T; 11.09.2014 в 11:58.
|
|
|
|
11.09.2014, 13:04
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Задержка импульса
Если не получается, то нужно упростить прогамму для начала. Выкинуть таблицы и обороты. Просто в main() настроить порты, таймер и прерывание, в регистр сравнения занести какое-нибудь число, например 1000. Затем в прерывании INT0 просто дёрнуть одной ножкой МК, а в прерывании по совпадению дрыгнуть другой ножкой. И всё.
Для начала добиться работоспособности этого куска. Подать импульсы на вход INT0 и посмотреть, как дёргаются ножки.
Вот, типа, пример:
Код:
|
void main(void)
{
DDRB=0xff; //определяем порт B на выход
// настройка Таймера1
TCCR1B=0x04
TIMSK=0xE0; //прерывания по переполнению и сравнению
OCR1A=1000;
// Настройка INT0
GIMSK|=0x40; //разрешаем INT0
MCUCR=0x03;
sei(); //глобальное разрешение прерываний
while(1){};
}
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCNT1L=TCNT1H=0x00; // Сбрасываем Таймер1 = 0
TCCR1B=0x02; // Запускаем Таймер1
PORTB.3=1;
delay_us(100);
PORTB.3=0;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
PORTB.4=1;
delay_us(100);
PORTB.4=0;
TCCR1B=0x00; // Останавливаем Таймер1
}; |
Последний раз редактировалось Yurkin2014; 11.09.2014 в 13:07.
|
|
|
Сказали "Спасибо" Yurkin2014
|
|
|
11.09.2014, 17:56
|
|
Прописка
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Задержка импульса
Юрий, спасибо за помощь !!!
С прерываниями я уже разобрался, и в данном коде прерывания работают прекрасно.
Такой нюанс, прерывания выполняются поочередно.
Исправил ошибки в коде и значения из таблицы начали сохраняться в регистре
OCR1AH=(int)(tablica[oborot]››8 ); //заносим задержку
OCR1AL=(int)tablica[oborot]; //в счётчик
Оборот пришлось уменьшить на 1 т.к отсчет происходит с нуля.
Тут также есть нюанс как только подать питание на МК то счетчик сразу начнет считать и при каждом вычитывании OCR1A будет происходить выходной импульс, следовательно в прерывании сравнения я обнуляю значение OCR1A, что бы в дальнейшем при простое оно не вызывалось.
Не пойму, что за глюк, принудительно заношу в oborot значение больше чем 369 к примеру 1000, далее условие срабатывает приравнивает 369, идем в таблицу, берем значение и заноси в регистр, но почему то заносится 114-е значение из таблицы 7100 вместо 369(17200), т.е происходит переполнение ![Улыбка](images/smilies/icon_smile.gif) )
if(oborot›369)oborot = 369;
OCR1AH=(int)(tablica[oborot]››8 ); //заносим задержку
OCR1AL=(int)tablica[oborot]; //в счётчик
Последний раз редактировалось SAHA_T; 11.09.2014 в 17:59.
|
|
|
|
11.09.2014, 21:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Задержка импульса
Ах, Yurkin2014, не потакайте "низменным пристрастиям" топикстартера! ![Прикольно](images/smilies/icon_wink3.gif)
Научите думать прежде, чем что-либо делать, а главное - думать - что делать хотя бы одного человека.
SAHA_T, плюньте Вы пока на кодинг.
Позже это окупится сторицей.
Расскажите своими словами логику работы программы для начала на верхнем уровне, вот прямо по шагам, с момента прихода импульса датчика на целый оборот.
P.S.
И не нужно "спасибкать" за каждый пост.
Я здесь не за этим.
|
|
|
Сказали "Спасибо" omercury
|
|
|
11.09.2014, 22:28
|
|
Прописка
Регистрация: 23.07.2007
Сообщений: 209
Сказал спасибо: 109
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Задержка импульса
Эх, я в неловком положении
*Расскажите своими словами логику работы программы для начала на верхнем уровне, вот прямо по шагам, с момента прихода импульса датчика на целый оборот.*
-срабатывает внешнее прерывание
-останавливаем счетчик
-берем значение из счетчика и смотрим в таблицу
-сбрасываем счетчик
-запускаем счетчик
-подсчитываем длительность импульса с помощью таблицы, т.е оборот равен определенной длительности импульса с шагом 256мкс
-далее условие на заниженные обороты, т.е нижний порог оборотов
-заносим значение в регистр сравнения, в данном случае OCR1A
т.е получается что мы заносим в регистр сравнения длительность импульса а нужно ....
|
|
|
|
11.09.2014, 22:38
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,543
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Задержка импульса
Чем быстрее будет перезапущен счетчик, тем точнее определение периода оборота.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:37.
|
|