roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 21:13

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 16:59 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Доброго времени суток.
Я новичек и столкнулся с задачей реализовать аппаратный шим на выводе PD5 tiny 2313. Я нашел пример описания шим на OC1A(PB3) однако весь порт B у меня занят под семисегментный индикатор.
использую CVAVR пишу на С.
Заранее спасибо за развернутый ответ)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 17:32 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
А где развернутый вопрос? :)
Где пример-то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 17:55 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Пример описания:
void init_pwm (void)
{
TCCR1A=(1<<COM1A1)|(1<<WGM10); //На выводе OC1A единица, когда OCR1A==TCNT1, восьмибитный ШИМ
TCCR1B=(1<<CS10); //Делитель= /1
OCR1A=0x00; //Начальная скорость нулевая
}
Этот код мне в принципе понятен, однако ШИМ будет выводиться на ногу МК которая у меня занята и освободить я ее не могу. Зато имеется свободная нога OC0B (PD5) 8 битный таймер счетчик, на эту ногу мне нужно вывести шим.

То что по моему должно работать:

void init_pwm (void)
{
TCCR0A = (0 << COM0A1) | (0 << COM0A0) // OC0A выключен
| (1 << COM0B1) | (0 << COM0B0) // включить OC0B, очистить OC0B on compare match, set OC0B at TOP
| (0 << WGM01) | (1 << WGM00); // PWM, phase correct, 8 bit
TCCR0B = (0 << WGM02) // PWM, phase correct, 8 bit
| (0 << CS02) | (0 << CS01) | (1 << CS00); // No prescaling
OCR0B = 0x00; //начальное значение нулевое
DDRD = (1 << PD5); //PD5 выход шим
}
//теперь для регулирования ШИМ я могу использовать:
OCR0B++;// увеличиваю заполнение сигнала
OCR0B--;// уменьшаю заполнение сигнала

Будет ли верна такая инициализация шим?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 19:56 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Да, похоже на правду. Правда (1 << COM0B1) | (0 << COM0B0) в режиме Phase Correct PWM имеют немного другой смысл, но значение верное.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 22:17 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Спасибо, вот попробовал на железе, так сказать. Не работает должным образом. Не знаю на что грешить.

#include <tiny2313.h>
unsigned int pp=100;//переменная для ШИМ скорость нарастания напряжения
//Попрограммы обработки прерываний
interrupt[EXT_INT0]void yvel_pwm(void) //обработка прерываний кнопки "+"
{
pp++;//увеличение при нажатии на кнопку "+" на 1
}
interrupt[EXT_INT1] void ymen_pwm(void)//обработка прерываний кнопки "-"
{
pp--;//уменьшение при нажатии на кнопку "-" на 1
}
//инициализация ШИМ
void init_pwm (void)
{
TCCR0A = (0 << 7) | (0 << 6) // OC0A выключен
| (1 << 5) | (0 << 4) // включить OC0B, очистить OC0B on compare match, set OC0B at TOP
| (0 << 1) | (1 << 0); // PWM, phase correct, 8 bit
TCCR0B = (0 << 2) // PWM, phase correct, 8 bit
| (0 << 2) | (1 << 1) | (0 << 0);
DDRD = (1 << 5); //PD5 выход шим
}
int main (void)
{
GIMSK=0b11000000; //разрешаем прерывание int0 и int1
MCUCR=0b00001111;// прерывание по возрастающему фронту - для кнопки 1 и 2
for (;;)//бесконечный цикл
{
OCR0B = pp;
init_pwm();
}
return(0);
}


Смысл программы в следующем, при возникновении прерывания int0 или int1 значение OCR0B должно меняться, соответственно, и меняется заполнение сигнала открывающего транзистор на выходе шим. Транзистор работает в ррежиме ключа на мотор. Увы, мотор меняет скорость вращения при каждом прерывании хаотично. Буду признателен за подсказку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 05 мар 2011, 23:04 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
eugmai86 писал(а):
использую CVAVR пишу на С.
Там есть мастер - его код всегда работает.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 06 мар 2011, 01:59 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
1. Не надо постоянно переинициализировать таймер в цикле. Одного раза хватит.
2. Есть подозрение, что там дребезг на кнопках и переменная pp увеличивается много раз. Рекомендую для начала попробовать в прерываниях не инкрементировать переменную, а выставлять ее в фиксированное значение, скажем 25% и 75%. Если станет работать устойчиво - надо будет делать антидребезг.
Я обычно вообще не пользуюсь прерываниями для опроса кнопок, там большие скорости не нужны, можно и из цикла опрашивать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 06 мар 2011, 12:31 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Спасибо, буду пробовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: tiny2313 реализация ШИМ на OC0B
СообщениеДобавлено: 06 мар 2011, 16:53 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Программа корректно заработала в таком варианте:

#include <tiny2313.h>
unsigned char pp=100;//переменная для ШИМ скорость нарастания напряжения
//Попрограммы обработки прерываний
interrupt[EXT_INT0]void yvel_pwm(void) //обработка прерываний кнопки "+"
{
pp=pp+2;//увеличение при нажатии на кнопку "+" на 1
}
interrupt[EXT_INT1] void ymen_pwm(void)//обработка прерываний кнопки "-"
{
if (pp>1)
{
pp=pp-2;
}
else
{
pp=2;//уменьшение при нажатии на кнопку "-" на 1
}
}
//инициализация ШИМ
void init_pwm (void)
{
TCCR0A = (0 << 7) | (0 << 6) // OC0A выключен
| (1 << 5) | (0 << 4) // включить OC0B, очистить OC0B on compare match, set OC0B at TOP
| (0 << 1) | (1 << 0); // PWM, phase correct, 8 bit
TCCR0B = (0 << 2) // PWM, phase correct, 8 bit
| (0 << 2) | (1 << 1) | (0 << 0);
DDRD = (1 << 5); //PD5 выход шим
}
int main (void)
{
init_pwm();
GIMSK=0b11000000; //разрешаем прерывание int0 и int1
MCUCR=0b00001111;// прерывание по возрастающему фронту - для кнопки 1 и 2
for (;;)//бесконечный цикл
{
#asm("sei");
OCR0B = pp;
}
return(0);
}

Закрывайте, спасибо


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

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


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

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO