Jump to content

Видеокурс по AVR-микроконтроллерам для начинающих


 Share

Recommended Posts

Попробовал, не помогло. А подскажите пожалуйста, не связано ли это с тем что на порт я вывожу один байт, а не 2-а, и полное заполнение байта равно десятичному значению -1

image.png.95c14db67cfe6f7d81a479856257d6ff.png

Спасибо большое, а то чет запутался в элементарном.

Link to comment
Share on other sites

2 часа назад, sport_rib сказал:

Попробовал, не помогло.

А если uint ?

2 часа назад, sport_rib сказал:

не связано ли это с тем что на порт я вывожу один байт, а не 2-а

Интересно, а как Вы выведите два байта в однобайтный порт ? :)

Link to comment
Share on other sites

для int8_t максимальное число 127.Для переменной tiktik при увеличении на 1 число должно будет увеличиваться от 0 до 127 потом должен быть снова 0, иначе ++ для отрицательного числа работать будет некорректно. Таким образом используется только 7 бит. Дополнительно вы в условии сравниваете tiktik (максимум 127) с число 256, чего никогда не будет. Думаю компилятор это условие совсем выбросит.

Поменяйте переменным tiktik и schet тип на uint16_t

лучше использовать единый стиль задания типов переменных: либо uint8_t, uint16_t..., либо unsigned char, signed int ...

Лучше использовать вариант uint8_t, т.к. в разных компиляторах, например, тип int, может иметь разную размерность

Link to comment
Share on other sites

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

Спасибо! заработало на UINT.  тогда я не пойму почему не отрабатывало на int, ну да ладно буду дальше штудировать матчасть. Всем большое спасибо за советы и "technik-1017" громаднейшее СПАСИБИЩЕ за разъяснение, и извините за глупые вопросы.

Link to comment
Share on other sites

Приглашаем на вебинар «Необычное в обычном. Сравнительный анализ современных решений Recom» (27.01.2022)

Приглашаем 27/01/2022 всех желающих посетить вебинар, посвященный двум наиболее растущим сегментам интегрированных источников питания – AC/DC малой мощности (1-20Вт) и сегменту решений PoL без изоляции. На вебинаре рассмотрим проблему выбора AC/DC в бюджетном сегменте и концепцию тестирования ускоренного старения, проведем сравнительный анализ подходов к интеграции AC/DC модулей. Сделаем обзор решений концепции POL с доисторических времен до современных технологий и средств для разработки и тестирования.

Подробнее

1 час назад, Alex сказал:

Интересно, а как Вы выведите два байта в однобайтный порт ? :)

Да в том то и дело что никак, мне пока непонятен тот факт, что я счет произвожу в "слове" - это 2-а байта (integer 16 bit)  или в "двойном слове" (uint или dint - 32  bit) , а результат вывожу в байт- 8bit.  Приложенный код уже немного по истерзан, по этому там и есть разница в типах переменных изначально все было в int8_t  и тут я и ошибся. Как я не мучил калькулятор не получалось у меня в этом типе данных выдать 0xFF, поскольку его значение это -1, максимум 0x7F- это и есть те семь разрядов с которыми я и мучился, спасибо что объяснили, а то гугл уже в шоке от моих тупых запросов. 

Edited by sport_rib
Link to comment
Share on other sites

Способы повышения КПД и удельной мощности инверторов для солнечных электростанций

Какую элементную базу выбрать для проектирования инверторов для солнечных батарей – новую карбид-кремниевую или традиционную кремниевую? Специалисты Infineon приходят к неожиданному выводу: традиционная кремниевая может помочь достичь КПД 99%. Но для этого следует применить сравнительно новую схему многоуровневого преобразования, которая может оказаться непростой для начинающего разработчика.

Подробнее

36 минут назад, sport_rib сказал:

мне пока непонятен тот факт, что я счет произвожу в "слове" - это 2-а байта (integer 16 bit)  или в "двойном слове" (uint или dint - 32  bit) , а результат вывожу в байт- 8bit.

Всё очень просто. При :

uint8 = uint16

у последнего просто отбрасывается старший байт, а младший заносится в int8-переменную.

Link to comment
Share on other sites

  • 2 weeks later...

Разработка преобразователей на основе карбид-кремниевых приборов с помощью симулятора SpeedFit 2.0

Компания Wolfspeed разработала бесплатный онлайн симулятор SpeedFit 2.0, позволяющий разработчикам быстро и всесторонне оценить параметры основных процессов, происходящих в силовой части импульсных преобразователей электрической энергии, и сравнить между собой различные варианты реализации поставленного технического задания.

Подробнее

В ‎24‎.‎03‎.‎2018 в 12:07, sport_rib сказал:

почему не загораются все диоды?

 

В ‎24‎.‎03‎.‎2018 в 20:21, sport_rib сказал:

Спасибо! заработало на UINT

Не верю! Все не загорятся.

Link to comment
Share on other sites

  • 2 weeks later...

Здравствуйте!
У меня возникла проблема с практикой 7 урока.
Для начала решила сделать все в точности, как было показано в видео, чтобы понять вообще принцип, но при запуски модуляции в протеусе на дисплеи просто белый экран.
Не могли бы вы посмотреть код, может где то есть ошибка.

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//Подключение библиотеки для работы с дисплем
#include "n5110.h"
#include <stdlib.h>
//Предварительные настройик
void preset()
{
 //Инициализируем дисплей
 Lcd_init();
 //Настройка АЦП
 //ADCRA
 ADCSRA |= (1<<ADEN)//Задействовать АЦП
 | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);// Делитель 128=64кГц
 //ADMUX
 ADMUX |= (1<<REFS1) | (1<<REFS0);//Опорное напряжение 2.56В внутренне
// | (0<<MUX3)| (0<<MUX2)| (0<<MUX1)| (0<<MUX0);// выбор лапки ADC0
 
}
int readADC(unsigned int ch)
{
 unsigned char set_admux = ADMUX;
 set_admux &= ~((1<<MUX3)| (1<<MUX2)| (1<<MUX1)| (1<<MUX0));
 switch(ch)
 {
  case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break;
  default: break;
 }
 ADMUX = set_admux;
 int tmp =  0;
    for(int i=0;i<32;i++)
 {
 ADCSRA |= (1<<ADSC); //Запуск преобразования
 while((ADCSRA &(1<<ADSC))); //Ожидание окончания преобразования
 tmp += ADC;
 }
 return tmp/32;

}
int main(void)
{   preset();
    while(1)
    {
  Lcd_clear();
  Lcd_printf(0,0,FONT_1X,((readADC(0)*2.56*(30/2.56))/1023),1);
  Lcd_printf(0,1,FONT_1X,((readADC(1)*2.56*(30/2.56))/1023),1);
 
        Lcd_update();
  _delay_ms(200);
  
  
    }
}

image.thumb.png.1087095a6595faa4955c3d2256bb61a0.png

Link to comment
Share on other sites

On 4/15/2018 at 10:58 AM, polych said:

Не могли бы вы посмотреть код, может где то есть ошибка.

В коде ошибок не нашел. Программа тоже не работает.

Удалил индикатор и вместо него вставил Nokia 5110. Заработало.

Конденсатор и питание к нему можно не подключать. Остальные ножки как и у этого.

Link to comment
Share on other sites

  • 2 weeks later...

Всем здравствуйте. Попался в руки датчик температуры и влажности DHT11, решил приляпать к atmege8, а в результате переменную не могу вывести:mellow:. Подскажите по коду, где слажал. Жаль примеров почти нет. Картинки и код прилагаются. Заранее спасибо!

//Atmega8
#define F_CPU 8000000 //частота 8МГц
#include <avr/io.h>
#include "n5110.h" //Библиотека LCD Nokia3310
#include <util/delay.h>
#include <stdlib.h>
#include "dht11.h"

char buffer[8]; //Переменная
int main( void ){
    Lcd_init(); // Инициализация LCD
    Lcd_clear(); // Очистка дисплея
    int8_t temperature = 0; //Установка параметров из библиотеки dht11.h
    int8_t humidity = 0; //Установка параметров из библиотеки dht11.h
    while(1) {
        humidity = dht11_gethumidity();
        temperature = dht11_gettemperature();
        itoa(temperature, buffer, 10);
        Lcd_printf(0,1, FONT_1X, humidity, 0); //Вывод дробного значения (и так уже попробовал)
        Lcd_printf(0,2, FONT_1X, temperature, 0); //Вывод дробного значения (и так уже попробовал)
        Lcd_print(0,3,FONT_1X,(unsigned char*) buffer); //Вывод на дисплей переменную
    Lcd_update(); //Копирование буфера в ОЗУ дисплея
    _delay_ms(200); //Задержка
        }
}

 

 

код.jpg

рисун.jpg

Edited by URRS
Link to comment
Share on other sites

4 hours ago, URRS said:

Подскажите по коду, где слажал

-1 это скорее всего ошибка. Посмотрите в файле dht11.h куда подключается датчик, если у меня таже библиотека, то к РС5.

Link to comment
Share on other sites

9 часов назад, snn_krs сказал:

...если у меня таже библиотека, то к РС5.

@snn_krs приветствую! Перед сборкой схемы поменял в библиотеке на РС4. Так по схеме удобно:). Надо выполнить 3 этапа: 1 Объявляем переменную (char buffer[8]); 2 присвоение переменной ...ххх... значения; 3 выводим полученного значения переменной на экран. Чую что значение не присвоил переменной... (пункт 2 пропущен). Вот код предложенный одним из пользователей к датчику, но дисплей у него другой.

char buffer[8];
int main( void )
{	LCDinit(); // Инициализация LCD
	LCDcursorOFF(); // Выключаем курсоор
	LCDclr(); // Очищаем дисплей

	int8_t temperature = 0; //ХЗ что это int8_t??
	int8_t humidity = 0; //ХЗ что это int8_t??
	while(1) {
		humidity = dht11_gethumidity(); //Обращение к установкам в библиотеке (значение) влажности
		temperature = dht11_gettemperature(); //...-...-
		//по коду видно, что переменная и ее значения присутствуют со статическим тексттом
		LCDGotoXY(0,0); //Координаты на дисплее
		sprintf(buffer, "T=%02d", temperature); //Переменная и ее значение + статика
		LCDstring(buffer,4); //Переменная и количество знаков после запятой
		
		LCDGotoXY(0,1);
		sprintf(buffer, "H=%02d", humidity);
		LCDstring(buffer,4);
	}
}

 

Link to comment
Share on other sites

1 hour ago, URRS said:

Чую что значение не присвоил переменной... (пункт 2 пропущен)

temperature = dht11_gettemperature();

Это и есть присвоение.

//temperature = dht11_gettemperature();
temperature = 28;

Сделайте так, и если вторая строка вместо -1 станет 28, значит ошибка в библиотеке, или протеус плохо работает с этой библиотекой

Link to comment
Share on other sites

43 минуты назад, snn_krs сказал:

если вторая строка вместо -1 станет 28, значит ошибка в библиотеке...

humidity = 30;//dht11_gethumidity();
temperature = 5;//dht11_gettemperature();
Lcd_print(0,0,FONT_1X,(unsigned char*) itoa(humidity, buffer, 10)); //Вывод на дисплей переменную
Lcd_print(0,1,FONT_1X,(unsigned char*) itoa(temperature, buffer, 10)); //Вывод на дисплей переменную

Как только поменял, 30 и 5 на дисплее появились. Значит вопросы к библиотеке... И в макетке так же отображается:unsure:. Попробую библиотеку поискать и заменить. @snn_krs спасибо за помощь. 

Link to comment
Share on other sites

Скомпилировал проект. Выдает ошибку не задана частота процессора. Вставил в самое начало файла dht11.с

#define F_CPU 8000000

заработало.

Link to comment
Share on other sites

Урааа, заработало!!!@snn_krs Спасибо большущее!  Сейчас допишу и выложу материал, вдруг кому пригодиться. К датчику направления ветра (16 направлений) пришлепаю, будет более функциональнее. Еще раз спасибо!

 

 

Link to comment
Share on other sites

Проект: Домашняя метеостанция на Atmega8 датчик DHT11 с выводом на LCD_Nokia3310(5110).

Выкладываю готовый проект с кодом для Atmel Studio 6.1, схемой для Proteus 7.10 SP0 (т.к. библиотека дисплея подходит только под эту версию), фото для выставления Fuses и всеми необходимыми библиотеками (LCD_3310(5110), DHT11). Вдруг кого заинтересует. Проект делал для дополнения функционала датчика направления ветра, далее и его выложу. Все коды были исправлены и написаны при участии ребят с местного форума. Сам слабоват в коде С++, за что им респект и уважение!

Прикрепляю код с более крупным шрифтом и возможным выводом дробного значения (закомпилирован)...

//Atmega8
#define F_CPU 8000000 //частота 8МГц
#include <avr/io.h> //Библиотека
#include "n5110.h" //Библиотека LCD Nokia3310
#include <util/delay.h>
#include <stdlib.h>
#include "dht11.h"

char buffer[8]; //Переменная buffer
int main( void ){
	Lcd_init();		// Инициализация LCD дисплея
	Lcd_clear();	// Очистка дисплея
	int8_t temperature = 0;		//Установка параметров из библиотеки dht11.h
	int8_t humidity = 0;		//Установка параметров из библиотеки dht11.h
	while(1){
		temperature = dht11_gettemperature();	//Присвоение переменной - температура
		_delay_ms(800);							//Задержка
		humidity = dht11_gethumidity();			//Присвоение переменной - влажность
		_delay_ms(800);							//Задержка
		Lcd_prints(0,3, FONT_1X, (unsigned char*)PSTR("ТЕМПЕР  ВЛАЖН"));
		Lcd_print(0,5,FONT_2X,(unsigned char*) itoa(temperature, buffer, 10));	//Вывод на дисплей переменную
		//Lcd_printf(0,5, FONT_2X, temperature, 1); //Пример вывод переменной с дробной частью
		Lcd_prints(4,5, FONT_2X, (unsigned char*)PSTR("C"));
		Lcd_print(8,5,FONT_2X,(unsigned char*) itoa(humidity, buffer, 10));		//Вывод на дисплей переменную
		Lcd_prints(12,5, FONT_2X, (unsigned char*)PSTR("%"));
		_delay_ms(200);		//Задержка
		Lcd_update();		//Копирование буфера в ОЗУ дисплея
	}
}

 

DHT11_proj.rar

IMG_20180501_193752.jpg

IMG-60b48760a533dc3ca28cd2deebd77b1b-V.jpg

Link to comment
Share on other sites

Проект: Датчик направления ветра на ATMEGA8 и выводом на LCD_5110(Nokia_3310)

Представляю вариант датчика направления ветра с точностью до 16 направлений (22,5 градуса). Принцип его действия прост и основан на оптическом формировании информации. А именно: сверху ставиться ИК светодиод, снизу (по направлению друг к другу) ИК фотодиод, а между ними пластинка с отверстием. При прохождении света через отверстие свет поступает на ИК фотодиод и он посылает сигнал на МК (см.рисунок). Существуют два сигнала: есть свет или нет, т.е. логический «0» или «1». Можем получить два значения, но если установить 4 свето и фото диода, то получим 42=16 значений (4 бита информации).

5ae97d6f1c48e_.gif.3077bb1601a4856611478447a00bb73f.gif

Плюсы оптической схемы формирования сигнала информации: лёгкость исполнения, точность, сжатие информации (4 бита = 16 значений), широкое применение в сфере электроники (пож.датчик, волоконно-оптические системы передач и т.д., малые энергозатраты (и т.д.), низкая цена реализации.

//Atmega8
#define F_CPU 8000000 //частота 8МГц
#include <avr/io.h>
#include "n5110.h" //Библиотека LCD Nokia3310
#include <util/delay.h>
#include <stdlib.h>

int main(void)
{
	Lcd_init();		//Инициализация дисплея
	Lcd_clear();	//Чистка дисплея
	PORTC |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3); //Порт 0,1,2,3 включены на приём
	while(1)
	{		
		switch(PINC & 0x0F) //Вывод направления ветра на дисплей (PINC & 0b1111)
		{	case 15: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ВОСТОЧНЫЙ       ")); break;
			case 14: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("В-В-СЕВЕРНЫЙ    ")); break;
			case 13: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("С-С-ВОСТОЧНЫЙ   ")); break;
			case 12: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРО-ВОСТОЧНЫЙ")); break;
			case 11: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("З-З-СЕВЕРНЫЙ    ")); break;
			case 10: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРО-ЗАПАДНЫЙ ")); break;
			case 9: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("СЕВЕРНЫЙ        ")); break;
			case 8: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("С-С-ЗАПАДНЫЙ    ")); break;
			case 7: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("В-В-ЮЖНЫЙ       ")); break;
			case 6: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮГО-ВОСТОЧНЫЙ   ")); break;
			case 5: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮЖНЫЙ           ")); break;
			case 4: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("Ю-Ю-ВОСТОЧНЫЙ   ")); break;
			case 3: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЗАПАДНЫЙ        ")); break;
			case 2: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("З-З-ЮЖНЫЙ       ")); break;
			case 1: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("Ю-Ю-ЗАПАДНЫЙ    ")); break;
			case 0: Lcd_prints(0,1,FONT_1X,(unsigned char *)PSTR("ЮГО-ЗАПАДНЫЙ    ")); break;
			default: break;
		}
		//Вывод на дисплей LCD_5110(Nokia3310)
		Lcd_prints(4,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:"));
		Lcd_update(); //Копирование буфера в ОЗУ дисплея
		_delay_ms(200); //Задержка
	}
}

Весь наработанный материал размещен в архиве (код с++, схема, коды направлений, фото разработки, схема в Proteus 7.10 SP0, библиотека). Проект находится на стадии разработки и любые внедрения и модернизации будут приветствоваться.

Если кто подскажет с помощью какой функции можно собрать датчик скорости ветра (частотомер) с моделью: замерить количество импульсов за 10 секунд (таймер и буфер), после сравнить результат с табличным (10-20 импульсов = 2м/с, 20-30 имп = 3м/с и т.д.) и вывести на экран LCD?

Данный проект был задуман для контроля направления ветра (получить информацию), чтоб в сильный ветер поворачивать крупногабаритные радиолюбительские антенны и уменьшить их парусность.

5ae97b5367dd9_.jpg.734938d358e89284b50a1ce73f945e25.jpg5ae97b53f18db_.JPG.e6814f946c144e72c8ac7b76164ab8c0.JPGIMG_20180502_130624.jpg.d3a1623486cd66d190f73cb78e38822a.jpg

5ae97ca0c369e_.jpg.0ce4b4eab0b54991f7e60a5da887d46b.jpg

Wind_direction_proj.rar

Edited by URRS
Link to comment
Share on other sites

  • 3 weeks later...
Guest Дмитрий

Здравствуйте, проблема такого плана. Дисплей в Proteus 8 при моделировании горит белым светом, на каждый пиксел, так же и с готовыми проектами, во всех случаях, когда проект должен работать.

AVR.jpg

Link to comment
Share on other sites

В 22.05.2018 в 13:12, Гость Дмитрий сказал:

Дисплей в Proteus 8 при моделировании горит белым светом

Проверяйте версию Протеуса и дисплея. Тот дисплей что используется в этой теме, не всегда работает с 8-м Протеусом.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

В 22.05.2018 в 20:12, Гость Дмитрий сказал:

Дисплей в Proteus 8 при моделировании горит белым светом

Поставьте "родной" дисплей из Proteus 8 параллельно, соединения сделайте соответственно, удалите старый дисплей. Примерно так как на скрине.

 

2018-05-26_094735.jpg

Edited by gogaze
Добавление файлов

Мир не без добрых людей!

Link to comment
Share on other sites

  • 2 months later...

Добрый день,

Вопрос по видеокурсу от уважаемого Kobraz.

Собрал термометр на lm335, все работает. Но когда пытаюсь прописать простейшее условие, что при падении температуры ниже, допустим, 30 градусов, подать логическую 1 на выход, на какую-нибудь лапку, напряжение на лапку подается, но совсем не такое, какое я ожидаю. Я ожидаю напряжение питания (4,2 вольта от аккумулятора), а появляются какие-то невнятные 1,07 вольт....

Link to comment
Share on other sites

Предполагаю, вы не нстроили соответствующий пин микрокнтроллера на режим ВЫВОДА, т.е. не установили в его регистре DDR в единичку нужный бит.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Link to comment
Share on other sites

Добрый день!

При прохождении миникурса застрял на 3_ем уроке

Начинаю работь на Atmel Studio 7   и  при  отладке кода получаю  открытие  файла delay.h      и выделенную строку   187   как я понимаю это ошибка

код написан как в уроке    что с этим можно сделать не понятно

__builtin_avr_delay_cycles = Unknown identifier   

 

Спасибо.

Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • Точно так - один с общим анодом, второй с общим катодом. Отладочная плата под  МК Atmega 8/48/88/168/328  DIP. Питание 5 или 3,3. С динамической индикацией на этой плате играться не планирую.
    • А корректор с каким коэф пульсаций рассчитывался? Пакетный режим должен перестать работать с мин нагрузкой. LLC не айс для музычки, имхо. 
    • Чуть выше вы говорили что у вас один индикатор. Определитесь с начала какой именно общий анод или общий катод. Или хотите и тот и другой. Какое питание у контроллера? И если у вас два индикатора и динамическая индикация то ток через сегмент будет в два раза выше иначе упадет яркость. Соответственно для коммутации общих выводов ток соответственно будет ток сегмента умноженый на семь. Для комутации индикаторов  в любом случае потребуется транзистор. Если программу будете писать сами ставьте две MBI-ки и не мучайтесь. Будет все компактно и просто.  
    • Привет всем! Извиняюсь, совсем не видел ответов. Перемотал трансформатор с другим расчётом и другим проводом - теперь литц из жил 0,16мм на всех обмотках. Мотал под 4А/мм2. Индукция получилась 0,145T. Резонансная частота 89,1 кГц, максимальный Gain 1.3, m=5.55. Первичка 528 uH, индуктивность рассеивания 95 uH, делал с секционированием. Попробовал поменять выходные конденсаторы. Было 2 шт по 1800 реальных мкФ, LowESR, сейчас поставил один супер высокотоковый Epcos 1400 мкФ с ESR 3,5 мОм. Зашунтировал керамикой по 4,7 мкФ 50V - 5 штук. Добавил конденсатор на 1nF 2kV между горячей и холодной землёй. Поменял ключи в синхронном выпрямителе с IRL3705 (55V 86A 10мОм 3,6pF) на IPP032N06N3G (60V 120A 2.9мОм 10,6nF). Добавил дополнительно маломощные Шоттки между DS транзисторов (шунт внутреннего диода). В затворы воткнул по 3 Ом резистору. Замеры КПД и температур: Voltage: 27V; Current: 2A, 4A, 6A, 8A, 10A, 12A. Температура воздуха: 23С (без обдува и сквозняка); Замер и повышение нагрузки каждые 15 мин. 54W /// 59.76W = 90.88%  //  Mosfet 36   // Cap 29  //  Trans 42  //  FSFR 34  //  Bridge 30  //  Coil 34  //  PFC-Mos 31 108W / 116.30W = 92.86%  //  Mosfet 43  //  Cap 31  //  Trans 48  //  FSFR 38  //  Bridge 31  //  Coil 31  //  PFC-Mos 31 162W / 172.90W = 93.64%  //  Mosfet 51  //  Cap 39  //  Trans 50  //  FSFR 39  //  Bridge 36  //  Coil 36  //  PFC-Mos 35  216W / 229.75W = 94.02%  //  Mosfet 60  //  Cap 48  //  Trans 60  //  FSFR 46  //  Bridge 40  //  Coil 43  //  PFC-Mos 38 270W / 287.35W = 93.96%  //  Mosfet 69  //  Cap 52  //  Trans 80  //  FSFR 55  //  Bridge 45  //  Coil 45  //  PFC-Mos 43 324W / 345.80W = 93.70%  //  Mosfet 79  //  Cap 59  //  Trans 88  //  FSFR 65  //  Bridge 50  //  Coil 53  //  PFC-Mos 48 -------------------------------------------------------------------------------------------------------------------------- *Mosfet - радиатор выходных мосфетов SR *Cap - верхняя часть выходного конденсатора Epcos *Trans - самая горячая часть силового трансформатора - поверхность вторичной обмотки. *FSFR - радиатор контроллера LLC FSFR2100U *Bridge - радиатор входного моста *Coil - верхняя часть кольца APFC *PFC-Mos - радиатор мосфета и диода APFC ------------------------------------------------------------------------------------------------------------------- @sashka сделал для тебя замеры. Пульсации по большей части вызваны очень скромной ёмкостью корректора, всего 150 мкФ. Увы без сильных пульсаций на низкой нагрузке не получается (только если частоту не задрать), так что там работает пакетный режим. БП делается для светодиода, там мне не принципиальны пульсации такой величины.  
    • Дело не в мощности рассеяния. Была статья по реле, почему слаботочные плохо подходят для коммутации нагрузок УМЗЧ.
  • Similar Content

    • By Super Akk
      Здравствуйте, я работаю в Proteus и у меня возникла ошибка Simulation is not running in real time due to excessive CPU load
      Подскажите пожалуйста как её исправить
      Код прошивки:
      #include <lm3s300.h> // Graphic Display functions #include <glcd.h> // Font used for displaying text // on the graphic display #include <font5x7.h> // Declare your global variables here void main(void) { unsigned char odin[] = { 0x08, 0x00, 0x08, 0x00, #ifndef _GLCD_DATA_BYTEY_ 0x00, 0x10, 0x18, 0x14, 0x10, 0x10, 0x7C, 0x00, #else 0x00, 0x00, 0x48, 0x44, 0x7E, 0x40, 0x40, 0x00, #endif }; // Declare your local variables here // Variable used to store graphic display // controller initialization data GLCDINIT_t glcd_init_data; // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0); // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer1 Stopped // Mode: Normal top=0xFFFF // OC1A output: Disconnected // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer2 Stopped // Mode: Normal top=0xFF // OC2A output: Disconnected // OC2B output: Disconnected ASSR=(0<<EXCLK) | (0<<AS2); TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20); TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // Timer/Counter 2 Interrupt(s) initialization TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2); // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); EIMSK=(0<<INT1) | (0<<INT0); PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0); // USART initialization // USART disabled UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR1=(0<<AIN0D) | (0<<AIN1D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); // SPI initialization // SPI disabled SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0); // TWI initialization // TWI disabled TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE); // Graphic Display Controller initialization // The KS0108 connections are specified in the // Project|Configure|C Compiler|Libraries|Graphic Display menu: // DB0 - PORTB Bit 0 // DB1 - PORTB Bit 1 // DB2 - PORTB Bit 2 // DB3 - PORTB Bit 3 // DB4 - PORTB Bit 4 // DB5 - PORTB Bit 5 // DB6 - PORTB Bit 6 // DB7 - PORTB Bit 7 // E - PORTC Bit 0 // RD /WR - PORTC Bit 1 // RS - PORTC Bit 2 // /RST - PORTC Bit 3 // /CS1 - PORTC Bit 4 // /CS2 - PORTC Bit 5 // Specify the current font for displaying text glcd_init_data.font=font5x7; // No function is used for reading // image data from external memory glcd_init_data.readxmem=NULL; // No function is used for writing // image data to external memory glcd_init_data.writexmem=NULL; glcd_init(&glcd_init_data); glcd_putimage(0,0, odin, GLCD_PUTCOPY); while (1) { // Place your code here } } Схема прикреплена ниже в архиве

      Схема.rar
    • By Н_Д_А
      Всем привет).
      Может, кому-то эта статья  сэкономит много времени и нервов. 
      Недавно  по работе встретился с интересной задачкой.
      Нужно было передать на железку по порту RS485 информацию для проверки работоспособности последней.
      Так как не всегда имеется в ремонте вся система, то для начала нужно было посмотреть, на заведомо исправной системе, что же там между ними (железками) передаётся.
      Логический анализатор показал что девайсы общаются по не совсем стандартному, а по  9ти битному протоколу (USART 9n1).
      А это усложняло задачу, так-так известные мне терминальные программы его не поддерживают.  И без бубна не обойтись))).
      Начались поиски решения.
      Через некоторое время стало понятно, что AVR позволяет это делать и даже в даташите подробно это описывает.
      Дело за малым. Реализация задуманного))). 
      Все регистры выставлены по документу………..Для Atmega8a.
      void USART_Init( unsigned int speed) //Инициализация модуля USART { UBRRH = (unsigned char)(speed>>8); UBRRL = (unsigned char)speed; UCSRB=(1<<RXEN)|( 1<<TXEN); //Включаем прием и передачу по USART UCSRB |= (1<<RXCIE); //Разрешаем прерывание при передаче UCSRA |= (1<<U2X); //удвоение скорости UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); UCSRB |= (1<<UCSZ2); // Включаем 9bit режим // Обращаемся именно к регистру UCSRC (URSEL=1) // ассинхронный режим (UMSEL=0), без контроля четности (UPM1=0 и UPM0=0) // 1 стоп-бит (USBS=0), 8-бит посылка (UCSZ1=1 и UCSZ0=1) // если (UCSZ1=1 и UCSZ0=1 и UCSZ2=1) 9bit mode. // UCSRC |= (1<<UPM1);//четность } По даташиту передача 9го бита происходит установкой или сбросом TXB8. 
      То есть, установили бит, передаётся 1 в старшем 9ом разряде, сбросили – 0. 
      void USART_Transmit( unsigned int data ) // функция передачи 9ти бит из даташита. { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ) ; /* Copy ninth bit to TXB8 */ UCSRB &= ~(1<<TXB8); if ( data & 0x0100 ) //не понял, что они хотели этим сделать. UCSRB |= (1<<TXB8); /* Put data into buffer, sends the data */ UDR = data; } И вот незадача, числа размером до 1 байт передаются без проблем, а числа больше 0xFF (255) нет).
      А устройство передаёт числа до 510.
      Предлагаю решение.  Может и не самое лучшее, но вполне работоспособное.
      int main(void) { USART_Init (103);//9600 //------------------------------------------------------------------------------------ while(1) { for (i=0; i<22; i++) { code_simbol = simbol[i]; //символ из массива //-------------------------------------отправка в UART-------------------------------- if (code_simbol > 255) { pr=1; // флаг передачи символа больше 0xff (255 десятичное) } else { pr=0; // флаг передачи символа меньше 0xff } USART_Transmit(code_simbol,pr);//собственно сама функция отаравки } } } А теперь и сама функция передачи .
      void USART_Transmit( unsigned char data, uint8_t prisnak ) //Функция отправки по USART { while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема if (prisnak==1) { UCSRB |= (1<<TXB8); //устанавливаем для передачи еденицы в старшем разряде } else { UCSRB &= ~(1<<TXB8); //сбрасываем старший разряд } /* Put data into buffer, sends the data */ UDR = data; //Начало передачи данных asm volatile ("nop"); Соответственно если число для предачи мньше 256 мы передаём его при нулевом 9ом бите.
      Ну а если больше то 9й бит выставляем в единицу.
      А вот и результат.

       
    • By France de Vague
      Здравствуйте.
      Я собрал схему для генерации звуков на AVR по материалам вот этой статьи на Хабре.
      Использовал ATMega328P. В этом проекте частота ШИМ 31250 Гц, так что я собрал фильтр - RC-цепь, где R = 510 Ом, а С = 0.1 мкФ приложил схему к посту (эти значения я рассчитал на предложенном в статье калькуляторе ШИМ-фильтров (приложил скриншот); нагрузкой поставил динамик с сопротивлением 8 Ом, на схему подал 5В питания с лабораторного БП.
      Я загрузил в микроконтроллер демо-код, который должен проигрывать последовательность звуков. Фьюзы, вроде бы, стандартные, но я на всякий случай приложил скриншот и с ними.
       
      В общем, проблема в том, что звук, который он должен воспроизводить звучит приглушенно, зато блин стоит какой-то монотонный писк, иногда почти скрип и вот он очень громкий. 
      Я подумал, что проблема в неправильно рассчитанном фильтре или какой-нибудь наводке. Собрал их сто тысяч разных, но писк только приглушался вместе со всем остальным, когда я большие сопротивления ставил, а по частоте на слух не менялся(не уверен, должен ли был), хотя емкости я пробовал тоже очень разные.
      Я немного почитал код, попробовал отключить функцию подавления щелчка при сменах нот (это ничего не изменило). Код довольно сложный, чтобы пытаться всерьез искать там какие-нибудь ошибки, да и я подозреваю, что там их нет.
      Не могу понять в чем проблема уже пару дней. Возможно, кто-то уже собирал этот проект или что-нибудь подобное и сталкивался с таким? Подскажите, если так. 
      Так же, я не уверен, может быть, проблема физическая и она в микроконтроллере, думаю стоит попробовать попробовать другой камень.
      Заранее спасибо.



    • By fander36
      Здравствуйте. Возник ниже стоящий вопрос.
      Cуществующие технологии отладочных плат для AVR.
      Хотелось бы узнать больше об этом, но в интернете не нашел ничего дельного.
    • By eyuw
      Б/у контролеры холодильной установки: 1) Eliwell 974LX  на atmega16A-PU , 3 реле - характеристики на фото.Цена 15 бел.руб. 2) Eliwell IDPlus974  на atmega32A-PU, 3 реле - характеристики на фото.Цена 18 бел.руб. Корпуса без передней панели закрывающей цифровой индикатор, без датчиков температуры! г.Толочин, Витебская обл. Отправка по Беларуси наложенным платежом. Покупатель также оплачивает почтовые расходы. 


×
×
  • Create New...