STP16CP05 не могу разобраться
- Войдите на сайт для отправки комментариев
Здравствуйте, дорогие форумчане! Не могу разобраться с драйвером светодиодов STP16CP05. Написал код на коленке, ни разу не программист, в основном пользуюсь готовыми кодами для своих мелких поделок, за что спасибо умным людям. Решился зажечь 64 светодиода, но не все, а те, которые нужны, в зависимости от настроек. Со сдвиговым регистром 595 разобрался через shiftout, но они 8-ми битные. Для своей поделки решил поставить STP16CP05 для уменьшения количества резисторов и большей мощности. Код написал по аналогии с 595, не заработало. Сетка из диодов 8х8 светодиодов в соответствии с кодом не работает, загораются рандомные светодиоды. Работает только включение и отключение светодиодов по ножке OE. Даташит читал, тайминги смотрел, но не работает, с английским туговато. Питание светодиодов через линейный стабилизатор на 5В, резистор на R-EXT в соответствии с даташитом поставил 1кОм, все остальное на прямую к ардуине, без обвязки. Светодиоды включаются, как хотят. Прикрутил 1602 с кнопками, чтобы задавать необходимое количество диодов по ширине и высоте, и задавать время свечения. В регистры не пишутся данные через shiftout, отправляю по 8бит 2 раза. Подскажите, куда копать? Спасибо, заранее.
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); byte ledUV[9]= {B11111111,B11111110,B11111100,B11111000,B11110000,B11100000,B11000000,B10000000,B00000000}; int latchPin = A3; //Пин подключен к LE входу STP16CP05 int clockPin = A4; //Пин подключен к CLK входу STP16CP05 int dataPin = A1; //Пин подключен к SDI входу STP16CP05 int onPin = A2; //Пин подключен к OE входу STP16CP05 const int BUTTON_NONE = 0; //присваиваем постоянное значение для BUTTON_NONE const int BUTTON_RIGHT = 1; //присваиваем постоянное значение для BUTTON_RIGHT const int BUTTON_UP = 2; //присваиваем постоянное значение для BUTTON_UP const int BUTTON_DOWN = 3; //присваиваем постоянное значение для BUTTON_DOWN const int BUTTON_LEFT = 4; //присваиваем постоянное значение для BUTTON_LEFT const int BUTTON_SELECT = 5; //присваиваем постоянное значение для BUTTON_SELECT int w=0; int h=0; int t=0; int s=1; int a=0; int getPressedButton() //инициализация переменной { int buttonValue = analogRead(0); // считываем значения с аналогового входа if (buttonValue < 100) { //если при нажатии кнопки значение меньше 100 delay (500); return BUTTON_RIGHT; // выводим значение BUTTON_RIGHT } else if (buttonValue < 200) { //если при нажатии кнопки значение меньше 200 delay (500); return BUTTON_UP; // выводим значение BUTTON_UP } else if (buttonValue < 400){ //если при нажатии кнопки значение меньше 400 delay (500); return BUTTON_DOWN; // выводим значение BUTTON_DOWN } else if (buttonValue < 600){ //если при нажатии кнопки значение меньше 600 delay (500); return BUTTON_LEFT; // выводим значение BUTTON_LEFT } else if (buttonValue < 800){ //если при нажатии кнопки значение меньше 800 delay (500); return BUTTON_SELECT; // выводим значение BUTTON_SELECT } return BUTTON_NONE; //иначе, выводим значение BUTTON_NONE } void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(onPin, OUTPUT); digitalWrite(onPin, HIGH); digitalWrite(latchPin, HIGH); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); digitalWrite(latchPin, LOW); Serial.begin(9600); lcd.begin(16, 2); //Инициализируем дисплей: 2 строки по 16 символов lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print("LED-UV v1.0"); //Выводи надпись LED-UV v1.0 delay (500); lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); //стираем экран } void loop() { int button=getPressedButton(); switch (button) { case 1: lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print("Width,cm");//выводим надпись "Width" на экран и размер w=w+2; lcd.setCursor(0, 1); lcd.print(w); break; case 2: lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print("Height,cm");//выводим надпись "height" на экран h=h+2; lcd.setCursor(0, 1); lcd.print(h); break; case 4: lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print("Time,sec");//выводим надпись "Time" на экран t=t+5; lcd.setCursor(0, 1); lcd.print(t); break; case 3: lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); lcd.print("CLEAR"); w=0;h=0;t=0;a=0;s=1; break; case 5: int str=w/2; byte x=ledUV[str]; int y=h/2; s=0; a=0; lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); lcd.print("START"); delay (1000); digitalWrite(latchPin, HIGH); while (s<y) { shiftOut(dataPin, clockPin, MSBFIRST, x); s++; } digitalWrite(latchPin, LOW); digitalWrite(onPin, LOW); while (a<=t){ lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 1); //устанавливаем курсор на 1 строку 1 столба lcd.print(" "); lcd.setCursor(0, 0); //устанавливаем курсор на 1 строку 1 столба lcd.print(a); a++; delay(1000); } digitalWrite(onPin, HIGH); digitalWrite(latchPin, HIGH); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); shiftOut(dataPin, clockPin, MSBFIRST, B11111111); digitalWrite(latchPin, LOW); break; } }Пробовал такой тестовый код, тоже не работает. Светодиоды зажигаются, но не те. Зависимости не нашел.
int latchPin = A3; //Пин подключен к LE входу STP16CP05 int clockPin = A4; //Пин подключен к CLK входу STP16CP05 int dataPin = A1; //Пин подключен к SDI входу STP16CP05 int onPin = A2; //Пин подключен к OE входу STP16CP05 void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(onPin, OUTPUT); digitalWrite(onPin, LOW); digitalWrite(latchPin, LOW); delay(5); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111110); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); digitalWrite(latchPin, HIGH); digitalWrite(latchPin, LOW); } void loop() { digitalWrite(onPin, LOW); delay(1000); digitalWrite(onPin, HIGH); delay(1000); }Пробовал ставить задержку, тоже не прокатило.
int latchPin = A3; //Пин подключен к LE входу STP16CP05 int clockPin = A4; //Пин подключен к CLK входу STP16CP05 int dataPin = A1; //Пин подключен к SDI входу STP16CP05 int onPin = A2; //Пин подключен к OE входу STP16CP05 void setup() { pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(onPin, OUTPUT); digitalWrite(onPin, LOW); digitalWrite(latchPin, LOW); delay(5); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111110); delay(10); digitalWrite(latchPin, HIGH); delay(10); digitalWrite(latchPin, LOW); delay(10); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); delay(10); digitalWrite(latchPin, HIGH); delay(10); digitalWrite(latchPin, LOW); delay(10); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); delay(10); digitalWrite(latchPin, HIGH); delay(10); digitalWrite(latchPin, LOW); delay(10); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); shiftOut(dataPin, clockPin, MSBFIRST, 0b11111111); delay(10); digitalWrite(latchPin, HIGH); delay(10); digitalWrite(latchPin, LOW); delay(10); } void loop() { digitalWrite(onPin, LOW); delay(1000); digitalWrite(onPin, HIGH); delay(1000); }Даташит на STP16CP05. https://www.st.com/resource/en/datasheet/stp16cp05.pdf
Попробовал код с другой темы http://arduino.ru/forum/apparatnye-voprosy/adruino-led-driver-mbi5026 распиновка та же, код для микросхемы MBi5026. Не работает, светодиоды загораются, но опять без какой либо зависимости. Моргают, потом зависают в статичномп положении. Дайте подсказку, если не сложно. Плата на фото. https://radikal.ru/lfp/c.radikal.ru/c12/1907/57/50645116bab2.jpg/htm
Никто не знает в чем причина?