Easyelectronics.ru

Электроника для всех
Текущее время: 21 ноя 2019, 09:29

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: ШИМ
СообщениеДобавлено: 03 дек 2011, 22:40 
Заглядывает иногда

Зарегистрирован: 27 ноя 2011, 22:54
Сообщения: 35
Здравствуйте. Хотелось бы поглядеть на пример простейшей программы, реализующей ШИМ. Задача такая. Нужно просто, чтобы светодиод вначале медленно зажигался, а потом медленно гас. В учебном курсе есть пример на ассемблере, но мне хотелось бы на C посмотреть. Заранее спасибо :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 04 дек 2011, 18:06 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 19:27
Сообщения: 174
под какой контроллер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 04 дек 2011, 18:10 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6274
Откуда: Челябинск
На С и отличаться не будет ничем.

Точно такая же иницаализация регистров ШИМа и в цикле меняем значения в OCR регистрах. Не надо при виде ассемблера кричать "Ой ассемблер баюсь баюсь!!!", а надо взять и поглядеть в него. Там все просто.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 04 дек 2011, 19:08 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 16:17
Сообщения: 716
Откуда: Смоленск
а чем асм плох? для небольших проектов на МК- самое оно.

_________________
Enter or Escape? выбор есть всегда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 04 дек 2011, 21:02 
Заглядывает иногда

Зарегистрирован: 27 янв 2010, 19:27
Сообщения: 174
лучше для начала на асме попробовать. на С потом будет легче. Для ШИМ надо настроить таймер соответствующим образом. читайте datasheet на ваш контроллер.

попробуйте сами написать. если что-то не получается спрашивайте. только когда сам делаешь можно чему-то научиться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 05 дек 2011, 12:42 
Заглядывает иногда

Зарегистрирован: 27 ноя 2011, 22:54
Сообщения: 35
Да, вы правы. Попробую все - таки сам написать что - нибудь. А потом спрошу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 05 дек 2011, 13:09 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 16:17
Сообщения: 716
Откуда: Смоленск
будут вопросы- обращайся

_________________
Enter or Escape? выбор есть всегда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 02 янв 2012, 20:29 
Заглядывает иногда

Зарегистрирован: 27 ноя 2011, 22:54
Сообщения: 35
Здравствуйте, прошу проверить и указать мои ошибки. Вот код.

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
PORTD = 0xFF;
DDRD = 0x00;
PORTA = 0x00;
DDRA = 0xFF;
PORTB = 0xFF;
DDRD = 0x00;
OCR0 = 0x00;
TCCR0 = 1<<CS00|1<<CS02|1<<COM01|1<<COM00|0<<WGM01|1<<WGM00;
//sei();
while (1)
{
if (OCR0 == 0xFF)
{
OCR0 = 0x00;
}
else
{
OCR0 = OCR0 + 1;
}
}
}
увеличиваю постепенно OCR0 на 1, параллельно с этим считает TCNT0. Правильно понимаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 03 янв 2012, 19:33 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 16:17
Сообщения: 716
Откуда: Смоленск
задержку в цЫкл while(1) введи, он у тебя с пулеметной скоростью OCR пересчитывает.

_________________
Enter or Escape? выбор есть всегда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 03 янв 2012, 20:30 
Заглядывает иногда

Зарегистрирован: 27 ноя 2011, 22:54
Сообщения: 35
А как посчитать, какую задержку делать? У меня предделитель самый большой делит входной сигнал на 1024. Частота 8000000 Гц. Получается, что таймер считает с частотой 8000000/1024 = 7812 Гц. Так? То есть период 1/7812 = 1,2*10^(-4)с или примерно 0,1 мсек. Вроде так. Какую мне задержку сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 03 янв 2012, 20:42 
Заглядывает иногда

Зарегистрирован: 27 ноя 2011, 22:54
Сообщения: 35
нашел опечатку) Я инициализацию порта B на выход не сделал. У меня теперь светодиод мигает, но с морганием. У меня другой вопрос. Заметил такую вещь, что у меня постоянно в пол накала горит светодиодик в светодиодной ленте. Отчего так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 03 янв 2012, 20:44 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 16:17
Сообщения: 716
Откуда: Смоленск
такую, чтоб заметно было изменение яркости. Поставишь, к примеру, 10 милисекунд- полный цикл от 0 до 255 он пройдет за 2 с половиной секунды, потом по новой.

_________________
Enter or Escape? выбор есть всегда.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 10 янв 2012, 21:39 
Только пришел

Зарегистрирован: 22 ноя 2011, 20:43
Сообщения: 7
Откуда: Ульяновск
Вот код на асемблере.
Еще только учусь, прошу сильно не пинать :)

Show

Часть кода взята из уроков DI HALT'a.

Может обработчик прерывания можно сделать короче? Буду благодарен, если кто подскажет как.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 10 янв 2012, 22:06 
Старожил
Аватара пользователя

Зарегистрирован: 05 ноя 2010, 23:09
Сообщения: 237
Откуда: Новокузнецк
А работает пример? Впринципе все хорошо и лаконично. В прерывании ничего лишнего.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 11 янв 2012, 01:15 
Только пришел

Зарегистрирован: 22 ноя 2011, 20:43
Сообщения: 7
Откуда: Ульяновск
Да, работает на Pinboard II.
Потом немного доработал: двумя кнопками менял скажность (больше/меньше).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 23 апр 2012, 10:09 
Заглядывает иногда

Зарегистрирован: 25 окт 2010, 21:06
Сообщения: 120
Откуда: Липецк
Здравствуйте. Написал примитивный код без прерываний для мигания 2х светодиодов, на таймере 1. Предделитель поставил 1, период = 0,125мкс, но при задержки в 0,01с(_delay_ms(10)) период составляет 0,01*255+0,000125*255=2,55с. _delay_ms(100) - использую как-бы для "устаявшегося значения", но вопрос ни в этом. Подскажите как реализовать задержку, не используя _delay_ms(10), потому как при этой функции микроконроллер просто отсчитывает время не делая больше ничего?
//------------------------------------
#include<avr/io.h>
#include<util/delay.h>
int main(void) {
DDRD=(1<<PD4)|(1<<PD5);
TCCR1A=(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(0<<WGM11)|(1<<WGM10);
TCCR1B=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
OCR1A = 0;
OCR1B = 255;
asm("cli");//Запрещаем прерывания
while(1) {
OCR1A++;
OCR1B--;
_delay_ms(10);//Задержка 0,01с, в тесении кототрой выдается ШИМ
if(OCR1A==255) {
_delay_ms(100);
OCR1A = 0;
OCR1B = 255;
_delay_ms(100);
}
}
}
//------------------------------------


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ШИМ
СообщениеДобавлено: 24 апр 2012, 09:57 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 16:17
Сообщения: 716
Откуда: Смоленск
Dima_Em писал(а):
Подскажите как реализовать задержку, не используя _delay_ms(10), потому как при этой функции микроконроллер просто отсчитывает время не делая больше ничего?
Самое простое- на неиспользуемом таймере, можно в его прерывание прописать нужное действие. Либо, RTOS.

_________________
Enter or Escape? выбор есть всегда.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB