Драйвер MBI5030.

Это мини обзор. Писать статью с подробным рассмотрением драйвера времени нет.

MBI5030 — это довольно дешевый, но не сильно популярный светодиодный драйвер. Его главное достоинство, это 16-битный ШИМ на каждом канале. Его также можно настроить на 12-битный ШИМ.

Достоинства:
— дешевый.
— простой в обращении.
— ШИМ можно настраивать на разные режимы работы.

Недостатки:
— скромная документация, но там расписано все.
— нет внутреннего источника тактирования для ШИМ.
— нет режима сна.
— использован свой интерфейс. Не SPI.
— для изменения настроек одного канала нужно переписать настройки всех каналов.
нет ресета. В других микросхемах MBI он есть. Наверное не хватило ножек из-за ШИМ-ма. Ресет есть, но его нужно активировать.
— есть защита на случай если пропадет сигнал тактирования ШИМ-ма. Без сигнала тактирования, в некоторых случаях, светодиоды могут сгореть. Но по умолчанию она выключена.

В общем драйвер очень хороший.

Для работы с ним требуется три команды: Data Latch, Global Latch, Write Config.

Для записи настроек ШИМ нужно сначала отправить 15-ть команд Data Latch и в конце Global Latch. Важно заметить, что первыми идут настройки 16го канала.

Испытание его на RGB светодиодах.

Сигнал тактирования идет от микроконтроллера. Я использовал ШИМ в режиме CTC, частота 4Мгц. Режим работы MBI5030 асинхронный, защита на случай отсутствия сигнала тактирования включена.

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

Вот мой код (выпилен из моего проекта):

/*
 * MBI5030.h
 *
 * Created: 24.02.2012 2:43:18
 *  Author: a9d
 */ 


#ifndef MBI5030_H_
#define MBI5030_H_

namespace MBI5030
{
	// MBI5030
	// PD4 - MBI_ON - output active H
	// PF4 - LE
	// PB5 - GCLK (config CTC PWM mode)
	// PD7 - DCLK
	// PD6 - SDI	
	
	#define LED_ON		D,4,H		
	#define LED_LE		F,4,H		
	#define LED_GCLK	B,5,H		//pwm clk
	#define LED_DCLK	D,7,H		//data clk
	#define LED_SDI		D,6,H 
	
	//LED map
	
	// LED1
	// R - 2
	// G - 1
	// B - 0
	
	// LED2
	// R - 4
	// G - 3
	// B - 5
	
	// LED3
	// R - 8
	// G - 7
	// B - 6
	
	// LED4
	// R - 10
	// G - 11
	// B - 9
	
	
	//led driver
	class CMBI5030
	{
		public:
			void init();
			
			void SetColor(unsigned int* data);		
			
			void WriteConfig(unsigned int data);
			
			void Power_ON();			//ON CTC PWM generator
			void Power_OFF();			//OFF CTC PWM generator
			
		private:
			void DataLatch(unsigned int data);
			void GlobalLatch(unsigned int data);
			
			void HSV2RGB( unsigned int *r, unsigned int *g, unsigned int *b, unsigned int i_hue, unsigned char sat, unsigned char val );
			void SendData(unsigned int data,char LE);
			unsigned int LedMap[16];
	};
	//======================================================================
	
	
	void CMBI5030::HSV2RGB(unsigned int *r,unsigned int *g,unsigned int *b,unsigned int i_hue,unsigned char sat,unsigned char val )
	{
	   unsigned long c1, c2, c3;
	   unsigned long m_val;

	   unsigned char m_ii;

	   unsigned long m_hue;
	   unsigned long m_fr;

	   unsigned long m_sat;

	   //scaling val
	   m_val=(0xFFFF/0xFF)*(unsigned long)val;

	   if (!sat)
	   {
		  *r = *g = *b = m_val;
	   }
	   else
	   {
		  while (i_hue >= 360) i_hue -= 360;
			
		  m_ii=i_hue/60;
				
		  m_hue= (((unsigned long)i_hue*1000)/60);

		  m_fr=m_hue-((unsigned long)m_ii*1000);

		  //stalling sat
		  m_sat=(0xFFFF/0xFF)*(unsigned long)sat;

		  c1 = (m_val * (0xFFFF - m_sat)) / 0xFFFF;
		  c2 = (m_val * (0xFFFF - (m_sat * m_fr)/1000)) / 0xFFFF;
		  c3 = (m_val * (0xFFFF - (m_sat * (1000 - m_fr)/1000))) / 0xFFFF;

		  switch (m_ii)
		  {
			case 0: *r = m_val; *g = c3; *b = c1; break;
			case 1: *r = c2;  *g = m_val;*b = c1; break;
			case 2: *r = c1;  *g = m_val;*b = c3; break;
			case 3: *r = c1;  *g = c2; *b = m_val; break;
			case 4: *r = c3;  *g = c1; *b = m_val; break;
			case 5: *r = m_val; *g = c1; *b = c2; break;
		  }

	   }
	}//end HSV2RGB
	//======================================================================
		
	//set color on RGB led
	//input array len = 12 unsigned int16 (24 byte)
	// H0,S0,V0....H3,S3,V3
	void CMBI5030::SetColor(unsigned int* data)
	{
		//remapping
		//15=0
		//LedMap[13]=data[0];	 //R0
		//LedMap[14]=data[1];  //G0
		//LedMap[15]=data[2];  //B0
		
		HSV2RGB(&LedMap[13],&LedMap[14],&LedMap[15],data[0],data[1],data[2]);
		
		
		//LedMap[11]=data[3];  //R1
		//LedMap[12]=data[4];  //G1
		//LedMap[10]=data[5];  //B1
		
		HSV2RGB(&LedMap[11],&LedMap[12],&LedMap[10],data[3],data[4],data[5]);		
		
		//LedMap[7]=data[6];  //R2
		//LedMap[8]=data[7];  //G2
		//LedMap[9]=data[8];  //B2
		
		HSV2RGB(&LedMap[7],&LedMap[8],&LedMap[9],data[6],data[7],data[8]);
		
		//LedMap[5]=data[9];  //R3
		//LedMap[4]=data[10];  //G3
		//LedMap[6]=data[11];   //B3
		
		HSV2RGB(&LedMap[5],&LedMap[4],&LedMap[6],data[9],data[10],data[11]);
	
		//write color config
		for (char i=0;i<15;i++)
		{
			DataLatch(LedMap[i]);
			//_delay_us(256);
		}	
		GlobalLatch(LedMap[15]);
	}//end SetColor
	//======================================================================
	
	void CMBI5030::WriteConfig(unsigned int data)
	{
		SendData(data,5);
	}//end WriteConfig
	//======================================================================
	
	void CMBI5030::DataLatch(unsigned int data)
	{
		SendData(data,14);
	}//end DataLatch
	//======================================================================
	
	void CMBI5030::GlobalLatch(unsigned int data)
	{
		SendData(data,13);	
	}//end GlobalLatch
	//======================================================================
	
	void CMBI5030::SendData(unsigned int data,char LE)
	{
		
		for (char i=0;i<16;i++)
		{
			if((data & 0x8000) ==0x8000)
			{
				ON(LED_SDI);
			}
			else
			{
				OFF(LED_SDI);
			}
					
			data<<=1;
			
			ON(LED_DCLK);
			//asm("nop");
			OFF(LED_DCLK);
			
			//OFF(LED_SDI);
			
			if (i==LE)
			{
				ON(LED_LE);
			}
			//asm("nop");
		}
		
		OFF(LED_LE);		
	}//end DataLatch
	//======================================================================
	
	//OFF CTC PWM generator
	void CMBI5030::Power_OFF()
	{
		DRIVER(LED_GCLK,IN); 
		OFF(LED_ON);
	}//end Generator_OFF
	//======================================================================
	
	//ON CTC PWM generator
	void CMBI5030::Power_ON()
	{
		DRIVER(LED_GCLK,OUT); 
		ON(LED_ON);
	}//end Generator_ON
	//======================================================================
	
	void CMBI5030::init()
	{
		//DRIVER(LED_GCLK,OUT); 
		//config CTC PWM mode
		TCCR1A|=(0<<COM1A1)|(1<<COM1A0)|(0<<WGM11)|(0<<WGM10);
		TCCR1B|=(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
		
		OCR1AH=0;		//4 Mhz
		OCR1AL=0;
		
		//config pin
		DRIVER(LED_ON,OUT);
		OFF(LED_ON);
		
		DRIVER(LED_LE,OUT);
		OFF(LED_LE);
		
		DRIVER(LED_DCLK,OUT);
		OFF(LED_DCLK);
		
		DRIVER(LED_SDI,OUT);
		OFF(LED_SDI);
	}//end init
	//======================================================================
	
}



#endif /* MBI5030_H_ */


Сначала я пытался использовать палитру RGB. Но весь день провозившись так и не добился совпадения цветов.
Зато с HSV палитрой все пошло сразу на лад.

Тестовые цвета. Получены в программе PhotoLine.


И соответственно то, что видим в реале используя палитру HSV:






Для более точного воспроизведения цвета уже нужно зубрить даташит на светодиоды, а также нужна оптика к светикам.

ВАЖНО: В интернете есть два даташита на этот драйвер V1.0 и V2.0 (лучше использовать самую последнюю версию, 10-ю). Первая версия не правильная, в ней есть серьезные ошибки. Я их в коде исправил. Теперь RGB палитра работает, но HSV палитра для светодиодов работает лучше. Т.к. она не линейная.

Также в моем коде идет линейное масштабирование с 8бит на 16ть. Это не является верным. Масштабирование тоже должно быть нелинейным.
Добавил нелинейность. Но чтоб увидеть настоящую нелинейность и плавность смены цветов, нужно использовать числа с плавающей точкой. Я их не использовал т.к. либа для работы с ними весит 2.5Кб.

Фотографии после обновления:




  • +1
  • 15 марта 2012, 06:30
  • a9d

Комментарии (23)

RSS свернуть / развернуть
Но весь день провозившись так и не добился совпадения цветов.
Для начала можно почитать Шадрина и его переводы.
0
Читал даташит на этот драйвер, но так и не понял, можно ли подключить его выходы к светодиодам на 12В?
0
Максимум 17В
0
— простая в обращении.
Драйвер внезапно поменял пол?
— нет ресерта. В других микросхемах MBI он есть. Наверное не хватило ножек из-за ШИМ-ма.
Чего нету? Ресета? Или чего-то еще?

Алсо схему приведи. И что вообще за драйвер? Как и прочие MBI — многоканальный линейный с заданием тока одним резистором? Какой корпус, какой ток/мощность держит?
0
  • avatar
  • Vga
  • 15 марта 2012, 10:04
ничего не понял!
чем он лучше например
www.ti.com/lit/ds/symlink/tlc5940.pdf
такого дарйвреа?
16 каналов 12 бит на канал, в еепром можно прописать корекцию тока любого светика, светики до 17 вольт можно вешать, битность можно сделать хоть 2 бита хоть 8 хоть 12…
ток задаётся одним резистором до 120 миллиампер на канал, ШИМ используется с фазосдвигом чтоб одновременно не клацать всеми светиками(при 6,25%и ниже каждый канал будет смещен так что гореть одновременно будет только один светик, мпростой интерфейс СПИ аналог 595… такт данные и защелка… 33 мегагерца… есть вариант в ДИПе… стоит — 5 штук нашару с доставкой домой :)
0
А где говорится, что он лучше? У него конкурентов полно.
0
Первое, что бросается в глаза это разброс цен.
В розничной торговле MBI5030 стоит ~1.40$
tlc5940 ~ 3.60$
0
я вот посмотрел у нас… и нигде его не заказать :) а nkw на фрисемплах раздают… для радиоподелок то что надо :)
а если нужны тысячи то у того же дигикея они дешевле будут
и намного
0
А вот где бы его найти? Нашел в терраэлектронике, но, как я понял, они почтой не шлют… Или шлют, но если сумма больше 1500?..
Цена вроде не плохая: 50 рублей за штуку.
На ебаях его нет…
0
Где в России не знаю. В Украине его продает космодром.
0
Ну я думал какой-то забугорный магазин может…
На ебаях нашел только MBI5026… А вот ни MBI5030, ни MBI5039 нету… Блин, как же заколебало, что в нашей дыре ничего нету. А еще спрашивают — почему все прутся жить в столицу… Да потому что там хотя бы детали можно прикупить!
0
www.leddisplaysourcing.com/index.php?route=product/product&product_id=151

Есть еще полно магазинов. Но они все не европейские.
0
Дык мне бы любой подошел с вменяемой ценой (в терре 5039 лежат всего то по 33 рубля, только вот не заказать из нее) и доставкой.
Вот по этой ссылке цена очень вменяемая — 61 цент, но от 100 штук! >_< Мне всего десяток надо, максимум два десятка :)
0
У тебя в Москву никто из знакомых не мотается? На работу или ещё по каким делам? Я мог бы в Терре купить и отдать через такого человека. С почтой очень не хочется заморачиваться.
0
Спасибо, но в том и прикол, что в Москве у меня самого сестра двоюродная + сестра моего лучшего друга, и обе могли бы купить, а вот послать :) Наша почта — она такая почта :) Поэтому пока смотрю забугром, есстественно если не найду ничего сходного по цене с доставкой, тогда через сестренку закуплю. Хотя заказать из-за бугра мне привычнее и удобнее :)
0
А какая разница? Из-за бугра и из наших инет-магазинов той же почтой идет. Я пару раз таким образом в терре закупался — через знакомого и от него почтой.
0
Ну тоже в общем верно. Просто люблю рассмотреть все варианты. Да и что ли человек я такой — не люблю у кого-то что-то просить, не знаю почему, вроде как возникает при этом некое ощущение того, что ты что-то должен. Хотя сам вроде всегда помогаю с удовольствием, если просят :)
В общем посмотрим. В конце концов это не сиюсекундная необходимость.
0
Ну распродашь потом кому-нить лишние)
0
У них есть MBI5031 отличается только 12 битным ШИМом. При этом он стоит в два раза дешевле. 100 чипов стоят 31$.
0
Да, кстати, спасибо, взял на заметку.
0
Обновил статью. Добавилось замечание.
0
  • avatar
  • a9d
  • 16 марта 2012, 00:09
Спасибо за статью!!! Есть пару вопросов. Можна ли схему подключения? Какой компилятор (подойдет ли AVR Studio 4 или 5)? Можна ли работать с двумя — тремя одновременно? Какой контроллер? Воще возможна ли статья с более обширной инфой? Заранее спасибо.
0
Схема подключения в даташите. Для одного драйвера там всего три провода нужно подкинуть. И тактирование подать.
Максимальное кол-во драйверов на линии не указанно, а значит дофига.
Можно скомпилировать везде где есть С++.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.