PDA

Просмотр полной версии : Нужна помощь с MCP41050


demtro
01.05.2016, 20:07
Ребят, помогите разобраться с управлением mcp41050 через ардуино, почему-то микруха не реагирует ни на какие действия, на данный момент пытаюсь записать в микруху постоянное значение на резистор

skanch
01.05.2016, 22:37
Вот здесь (http://www.arduino-projekte.de/index.php?n=65) есть библиотеки по подключению к Ардуино. А здесь (http://radiokot.ru/forum/viewtopic.php?f=61&t=123457&sid=21621ca8e4dcf6ae5227215f3ceba757) обсуждалась подобная тема.
Вот тема (https://habrahabr.ru/post/259579/) использования MCP41050 для управления громкостью усилителя.

demtro
08.05.2016, 21:38
запустить потенциометр получилось вот таким скетчем, но значения очень нестабильны, постоянно плавают, как можно попробовать стабилизировать?

ali_vlad
08.05.2016, 22:24
Подтяжки кнопки по питанию есть? Обработка дребезга отсутствует. На форуме ардуино есть целый раздел, посвященный кнопке. Очень советую почитать хотя бы несколько первых страниц, тогда будет понимание.

demtro
08.05.2016, 22:36
Контакт постоянно подтянут к +, кнопка замыкает контакт на землю, кнопка с фиксацией

ali_vlad
09.05.2016, 06:12
А дребезг контактов? Можно использовать библиотеку bounce.h, а можно тупо delay().
Посмотри основной скетч из этой (http://pccar.ru/showthread.php?t=24126) темы, в частности обработку нажатия кнопки и сравнение старого и нового значения. Это типо фильтра. Работает стабильно.

skanch
09.05.2016, 09:26
запустить потенциометр получилось вот таким скетчем, но значения очень нестабильны, постоянно плавают, как можно попробовать стабилизировать?

А "родной скетч" (http://www.arduino-projekte.de/arduino_code/AH_MCP41xxx.ino) с ресурса (http://www.arduino-projekte.de/index.php?n=65) не заработал?#include "AH_MCP41xxx.h"
#include <SPI.h>

#define DATAOUT 11 //uno MOSI //IC SI
#define DATAIN 12 //uno MISO //IC not used
#define SPICLOCK 13 //uno SCK //IC SCK
#define CHIPSELECT 10 //uno ss //IC CS

byte resistance = 0;

AH_MCP41xxx mcp41010;

void setup()
{
Serial.begin(9600);
Serial.println("Setup ready");
mcp41010.init_MCP41xxx(CHIPSELECT); //spi pins initialisation
mcp41010.reset();
}

void loop()
{
Serial.print(resistance);
Serial.print(": ");
mcp41010.setValue(resistance); //value range 0-255 (8-bit)
delay(100);
resistance++;
if (resistance==255) {resistance=0;}
int signal = analogRead(A0);
Serial.print(signal);
Serial.print(" ~");
Serial.print((float)signal/1024*5);
Serial.println("V");
}

demtro
09.05.2016, 09:42
А дребезг контактов? Можно использовать библиотеку bounce.h, а можно тупо delay().
Посмотри основной скетч из этой (http://pccar.ru/showthread.php?t=24126) темы, в частности обработку нажатия кнопки и сравнение старого и нового значения. Это типо фильтра. Работает стабильно.
Я знаю про дребезг контактов, но это при аналоговом считывании актуально, у меня же кнопка HIGH-LOW, у ардуины ниже 2В это LOW, выше 3В это HIGH. Поэтому дребезг кнопки отпадает
to Skanch не пробовал т.к не совсем понял схему подключения, но суть должна быть та же, брал его за основу, поменял только условие и поставил фиксированное значение на выход.

skanch
09.05.2016, 09:56
Вот подключение для MEGA и UNO. Для других плат нужно смотреть где располагаются выводы MISO, MOSI и SCK.

ali_vlad
09.05.2016, 10:32
Дребезг кнопок присутствует при любом считывании, как при аналоговом, так и при цифровом. Это физическое свойство любой кнопки, переключателя, реле, геркона. Для борьбы с дребезгом в скетче из поста N°7 в цикле loop() присутствует delay(100); а в Вашем скетче нет ни какой обработки дребезга.
Попробуйте в своем скетче вместо mcp41050.setValue(xx); временно использовать Serialprintln(low или high); сначала без delay, а потом с использованием delay и посмотрите результат в мониторе порта.
И совет на будущее: чаще используйте монитор для вывода состояния процессов, идущих в цикле, чтобы наглядно было видно, что там происходит.

demtro
09.05.2016, 11:08
Видимо все оказалось проще: заменил MCP41050 на MCP41100 все завелось как надо, видимо чип был глюкнутый, сегодня MCP41050 вообще отказался работать.

demtro
09.05.2016, 11:44
Дребезг кнопок присутствует при любом считывании, как при аналоговом, так и при цифровом. Это физическое свойство любой кнопки, переключателя, реле, геркона. Для борьбы с дребезгом в скетче из поста N°7 в цикле loop() присутствует delay(100); а в Вашем скетче нет ни какой обработки дребезга.
Попробуйте в своем скетче вместо mcp41050.setValue(xx); временно использовать Serialprintln(low или high); сначала без delay, а потом с использованием delay и посмотрите результат в мониторе порта.
И совет на будущее: чаще используйте монитор для вывода состояния процессов, идущих в цикле, чтобы наглядно было видно, что там происходит.

Delay там используется для задания интервала смены значений резистора, а не от дребезга, там кнопка не используется, там просто MCP перебирает все значения подряд, при достижении максимального сбрасывается на 0