Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

ШИМ, синусоида на Мега8?

Непрочитано 05.02.2010, 01:42  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Может вот так пойдет?
Код:
#include	‹inttypes.h›
#include	‹avr/io.h›
#include    ‹avr/interrupt.h›

#ifndef	F_CPU
    #define	F_CPU	14745600UL
#endif

// сэмплов на период
#define SPP	    32UL
// частота в герцах
#define FREQ    1870UL
// TOP таймера
#define TIMER_TOP    ( (F_CPU/(SPP*FREQ)) -1)

uint8_t SinTbl[32] = { 122,146,169,190,208,223,235,242,244,242,235,223,20  8,190,169,146,122,98,75,54,36,21,9,2,0,2,9,21,36,5  4,75,98 };



ISR(TIMER1_OVF_vect)
{
static uint8_t TblIndex = 0;

    OCR1BL = SinTbl[TblIndex++];
    TblIndex &= 0x1F;
}


int	main(void)
{

DDRB |= (1‹‹PB2); // выход для ШИМ PB2 - OC1B
OCR1A = TIMER_TOP; // задаем период
// таймер - Fast PWM, TOP = OCR1A, non-inverting mode
TCCR1A = (0‹‹COM1A1)|(0‹‹COM1A0)|(1‹‹COM1B1)|(0‹‹COM1B0)|(1‹‹WGM11)|(1‹‹WGM10);
TCCR1B = (1‹‹WGM13)|(1‹‹WGM12)|(0‹‹CS12)|(0‹‹CS11)|(1‹‹CS10);
TIMSK = (1‹‹TOIE1);
sei();
while(1)
	{
	asm volatile("nop");
	};
}
Синусоида больно лохматая при 32 точках выходит...
Реклама:
kison вне форума  
Непрочитано 08.02.2010, 12:08  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Проверил в железе частота 1871 гц при TCNT1L=49.
Непойму где правда.
diglook вне форума  
Непрочитано 08.02.2010, 12:37  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Сообщение от diglook Посмотреть сообщение
Непойму где правда.
А у Вас других прерываний в программе нет? То, что предложил urry может работать только в "тепличных" условиях и очень сильно зависит от времени реакции на прерывание. Если прерывание одно, то это время фиксированное и все хорошо. Если же их несколько, то частота будет плавать. Кроме того частота зависит и от других факторов - версии компилятора, степени оптимизации. Т.е. константу для TCNT1L надо подбирать под свою систему. У Вас вот 49 получилось. Попробуйте вариант из 11 поста - там Ваш же изначальный алгоритм с делителем на 246 реализован, и он не зависит ни от системы, ни от других прерываний, если они конечно не имеют монстрообразных обработчиков.
kison вне форума  
Непрочитано 08.02.2010, 13:01  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Прерываний пока одно- обработчик синуса, но планируется еще УАРТ.
diglook вне форума  
Непрочитано 08.02.2010, 13:28  
SasaVitebsk
Гражданин KAZUS.RUN
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Читаю - порой удивляюсь.
А как вообще, тогда выводить частоту не кратную частоте процессора? Вы задумывались.

Вот я например работаю с FSK. То есть мне надо несколько синусов разной частоты выводить без потери фазы. И частота - никаким боком не бьъётся?

Всё просто - как грабли и не надо путать понятия.
1) Имеется частота сэмплирования (дискретизации). Если выводим быстрый ШИМ то бишь 8 бит, то частота = FPWM = FCLK/256. То есть 14745600/256 = 57600.
2) Создаём таблицу синуса. Чем больше - тем больше точность. Например с шагом 0.5 градуса. Размер 720 байт.
3) Создаём 1 прерывание по переполнению таймера. Там выводим ваш шим.
4) Частота синуса определяется сдвигом фазы в таблице вывода. Например при выводе частоты 1200 Гц получаем:
57600 / 1200 = 48. 360/48 =7.5 градуса. Или если брать по таблице 0.5 градуса 720/48 = 13. Таким образом ошибка составит 0%.

Выведем частоту 2700 к примеру. 57600/2700 = 21.333 = 21. 720/21 = 34.
Результирующая частота составит 2720. Ошибка составит 0,7%

Вывод в прерывании выглидит так
Код:
	ptrsin += F_OUT_BIT1;			  					// Если выводим "1"
	if(ptrsin›&sinus[VOL_SIN-1])ptrsin -= VOL_SIN;		// Кольцо по синусу
	dpwm = *ptrsin;										// Извлечь синус
OCR1A = (uint8_t)dpwm+128;							// выводим ШИМ со смещением к центру
где
int8_t __flash sinus[VOL_SIN];
int8_t __flash static *ptrsin = sinus;

Инициализация
TCCR1A = (1‹‹WGM10)|(1‹‹COM1A1); // режим Fast PWM 8 бит (Ногу на вывод PWM)
TCCR1B = (1‹‹WGM12)|(1‹‹CS10); // режим Fast PWM 8 бит / FCLK
TCNT1 = 0; // Сбросить таймер
OCR1A=0;
_TIFR1 = 0xff; // Сбросить все флаги
_TIMSK1 = (1‹‹TOIE1); // Разрешить прерывание от таймера 1 (вывод синуса)
_TIFR1 = 0xff; // Сбросить все флаги

И всё - 3 строчки.
SasaVitebsk вне форума  
Непрочитано 08.02.2010, 15:27  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

SasaVitebsk, можно подробней прокоментировать обработчик прерывания(несовсем понятна коррекция фазы)?
diglook вне форума  
Непрочитано 08.02.2010, 17:28  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Это технология прямого синтeза частоты, она же DDS. Информации море и она прекрасно гуглится. Например
compitech.ru/html.cgi/arhiv/01_07/stat_50.htm
radioradar.net/articles/scientific_technical/dds.html
pda.pro-radio.ru/measure/6873-8/
niXto вне форума  
Непрочитано 08.02.2010, 17:56  
=GM=
Прописка
 
Регистрация: 21.09.2009
Сообщений: 218
Сказал спасибо: 1
Сказали Спасибо 29 раз(а) в 27 сообщении(ях)
=GM= на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Александр, а так if(ptrsin›&sinus[VOL_SIN-1]) ptrsin = &sinus[0];
не проще? Будет просто сравнение и занесение адреса, никаких вычитаний.

И вместо двух строк

ptrsin += F_OUT_BIT1;
dpwm = *ptrsin;

сделать одну: dpwm = *(ptrsin++);
=GM= вне форума  
Непрочитано 08.02.2010, 18:08  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Сообщение от =GM= Посмотреть сообщение
Александр, а так if(ptrsin›&sinus[VOL_SIN-1]) ptrsin = &sinus[0];
не проще?
Я не Александр, но попробую ответить за него. Нет, это не проще, так работоспособность вообще нарушится. ptrsin - это накопитель фазы, а F_OUT_BIT1 это константа определяющая частоту сигнала.
Подробно принцип расписан в статье Ридико на телесистемах - http://telesys.ru/electronics/projects.php?do=p035
Если расширить разрядность накопителя, то можно и 0,01Гц получить.
Но DDS требует более качественной фильтрации, по сравнению со случаем когда частота генерируемого сигнала кратна частоте выборок.
kison вне форума  
Непрочитано 08.02.2010, 18:25  
diglook
Временная регистрация
 
Регистрация: 09.09.2009
Сообщений: 91
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 4 сообщении(ях)
diglook на пути к лучшему
По умолчанию Re: ШИМ, синусоида на Мега8?

Цитата:
Мужской глаз - самый точный измерительный прибор в мире
здесь ВЫ правы! В железе сильно заметна пила(~10%) - увеличится спектр излучения, изменение интегрирующей цепочки(подстроечный резистор, емкость менялась от 0.47 до 1 мкф) приводит только к изменению амплитуды синусоиды, установка фильтров более высокого порядка отвергнута, решили что проще будет ЦАП на R2R(благо свободных портов валом).

Хотя не факт что в паралельном ЦАПе будет красота.

Спасибо всем за участие! ШИМ Тема интересная(для меня точно) - может еще кто что подскажет ?
Миниатюры:
Нажмите на изображение для увеличения
Название: Фото004.jpg
Просмотров: 54
Размер:	65.2 Кб
ID:	4402  

Последний раз редактировалось diglook; 08.02.2010 в 18:36.
diglook вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ШИМ для стартера 55mak Источники питания и свет 10 21.08.2010 18:05
переделка БП на ШИМ 2003 на одно напряжение artem_y Источники питания и свет 9 26.02.2010 23:35
не работает ШИМ в контроллере 40inD Proteus 10 11.01.2010 00:22
Управление автомобильной форсункой ШИМ сигналом, Помогите stanikstanik Автоматика и аппаратура связи 2 19.11.2009 19:27
Нужно преобразовать ШИМ в 0-10В, нагрузка 3А Xuchik Источники питания и свет 37 02.10.2009 08:24


Часовой пояс GMT +4, время: 14:30.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.