Цифровой потенциометр и регулятор скорости двигателя
Я пытаюсь получить китайский контроллер скорости двигателя постоянного тока на 20 А, работающий с цифровым потенциометром MCP42100. Поставленный аналоговый потенциометр имел сопротивление 100 кОм. Я запрограммировал свой Arduino с помощью следующего кода:
#define DATAOUT 11
#define DATAIN 12 // не используется
#define SPICLOCK 13
#define SLAVESELECT 10
#define NOTEON 9
int potValue = 255;
float potInputValue;
void SPIInitialize()
{
byte clr;
pinMode(DATAOUT, OUTPUT);
pinMode(DATAIN, INPUT);
pinMode(SPICLOCK, OUTPUT);
pinMode(SLAVESELECT, OUTPUT);
digitalWrite(SLAVESELECT, HIGH); //отключаем устройство
SPCR = (1 << SPE) | (1 << MSTR);
clr = SPSR;
clr = SPDR;
delay(10);
}
char SPITransfer(volatile char data)
{
SPDR = data; // Начинаем передачу
while (!(SPSR & (1 << SPIF))) // Ожидаем окончания передачи
{
};
return SPDR; // возвращаем полученный байт
}
//--- код MCP42100
byte SetPot(int address, int value)
{
// Выбор подчиненного устройства установлен на низкое значение, чтобы разрешить команды
digitalWrite(SLAVESELECT, LOW);
// 2-байтовая команда
SPITransfer(0x10 + address); // 0x10 = команда «установить банк»
SPITransfer(value); // Значение для установки банка
// Освобождение чипа, передача окончания сигнала
digitalWrite(SLAVESELECT, HIGH);
}
//--- код приложения
void setup()
{
SPIInitialize(); // Инициализируем интерфейс SPI
Serial.begin(9600);
delay(25);
Serial.println("Type a resistance between 0-100 kOhms above.");
}
void loop()
{
if (Serial.available() > 0) {
// читаем входящий байт:
potInputValue = Serial.parseInt();
float potValue = (potInputValue / 100.0) * 255;
Serial.print("Value: ");
Serial.print(potValue);
Serial.print(", Resistance: ");
Serial.print(potInputValue);
Serial.println(" kOhms");
SetPot(1, potValue);
}
}
Вот изображение моей установки:
В настоящее время при сопротивлении 0 кОм двигатель работает на полной скорости, как и должен, и именно так он реагирует на аналоговый потенциометр. При сопротивлении 100 кОм мотору (в данном случае компьютерному вентилятору) еще хватает сока для вращения, пока я его не остановлю пальцем, но тогда без небольшого толчка он не крутится. При использовании аналогового потенциометра при 100 кОм двигатель не мог вращаться.
Вот ссылка на регулятор скорости: http://www.ebay.co.uk/itm/301366805277?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT
Похоже, что регулятор скорости использует таймер 555.
Что я делаю не так с цифровым потенциометром, чтобы он вел себя не так, как аналоговый потенциометр?
@JosephFTaylor, 👍0
Обсуждение2 ответа
Если вы посмотрите техническое описание MCP42100 http://www.microchip.com/, на странице 4 вы увидите Подробности вашего устройства. Обратите внимание, что фактическое сопротивление будет в диапазоне от 70 до 130 кОм.
Итак, причина, по которой вы получаете разные результаты, (вероятно) связана с тем, что у вас есть цифровой потенциометр с сопротивлением несколько ниже, чем у физического потенциометра, который вы использовали.
Похоже, что MCP42100 не является подходящим цифровым потенциометром для этого приложения.
Без схемы контроллера двигателя это трудно сказать, но можно предположить, что цифровой потенциометр воспринимает напряжения выше, чем напряжение питания, которое вы на него подаете, и выше, чем максимальное напряжение питания цифрового потенциометра (5,5 В; 7,0 В абс. макс.). Я не вижу регулятора напряжения на плате контроллера двигателя, да и для бюджетной конструкции он не нужен. Вероятно, как вы говорите, просто ШИМ с использованием 555.
Чтобы это работало, вам, вероятно, понадобится цифровой потенциометр другого типа — тот, который может принимать входы логического уровня и имеет более высокое напряжение питания (12 В + некоторый запас). Вам также обычно приходится подавать на него более высокое напряжение питания (и будьте осторожны, чтобы ничего не закоротило и не испортило микроплату).
В противном случае цепи защиты входов цифрового потенциометра проведут больший ток, чем можно было бы ожидать.
Я не уверен, что такой цифровой потенциометр существует, но в любом случае ЦАП, вероятно, будет лучшим выбором., @Nick Johnson
Привет, @НикДжонсон. Я не думаю, что ЦАП (кроме, возможно, 4-квадрантного умножающего ЦАП, который может принимать опорное напряжение 12 В) будет работать. В схемах такого типа обычно используется сопротивление потенциометра для активной зарядки и разрядки конденсатора, а не просто принимается управляющее напряжение. Такие цифровые горшки наверняка существуют (например, [AD5290](http://www.analog.com/media/en/technical-documentation/data-sheets/AD5290.pdf)) и есть другие от AD и Maxim., @Spehro Pefhany
- AnalogWrite не работает - при попытке контролировать скорость двигателя постоянного тока
- Ускорение двигателя постоянного тока с помощью ШИМ
- Угловая скорость двигателя постоянного тока, управляемая потенциометром
- Помощь с ускорением ПИД-двигателя постоянного тока
- Использование прерывания внутреннего таймера для чтения аналогового датчика
- Вопрос, касающийся использования Arduino и MIDI
- когда 3 компонента на Arduino nano работают вместе, один из них не работает
- Как использовать SPI на Arduino?
Вы ничего не рассказали нам о контроллере двигателя или о том, какие входные сигналы он ожидает, и не предоставили нам схему, поэтому я не понимаю, как кто-то мог бы на самом деле ответить на этот вопрос., @Nick Johnson
Я бы предложил использовать плату драйвера двигателя, которая была специально разработана для взаимодействия с микроконтроллером, а не пытаться настраивать ее на скорую руку. В качестве альтернативы вы можете использовать ЦАП на среднем проводе потенциометра вместо того, чтобы пытаться использовать цифровой потенциометр., @Nick Johnson