Найти в Дзене
Паяльник и код

CH32V003 + цифровой потенциометр MCP41010 через SPI интерфейс

Мы знаем, что аналоговый потенциометр представляет собой трехконтактный резистор со скользящим контактом, выполняющий функцию регулируемого делителя напряжения. Цифровой потенциометр (или цифровой резистор) имеет аналогичное назначение, но позволяет управлять положением этого «скользящего контакта» и, соответственно, выходным напряжением, с помощью цифровых сигналов (обычно через интерфейсы типа SPI или I²C). В этой простой инструкции я покажу вам, как управлять цифровым потенциометром MCP41010 с помощью микроконтроллера CH32V003F4P6 через SPI интерфейс MCP41ххх, в нашем случаи MCP41010 — Микросхема-потенциометр с цифровым управлением, изменение сопротивления происходит благодаря массиву из 256 резисторов. В серии есть потенциометры сопротивлением 10kΩ, 50kΩ и 100kΩ, MCP41010, MCP41050 и MCP41100 соответственно. Также существует сдвоенная микросхема MCP42010 с аналогичными параметрами Удобных модулей с такой микросхемой не существует, но MCP41010 можно найти в DIP корпусе или SO8 верс

Мы знаем, что аналоговый потенциометр представляет собой трехконтактный резистор со скользящим контактом, выполняющий функцию регулируемого делителя напряжения. Цифровой потенциометр (или цифровой резистор) имеет аналогичное назначение, но позволяет управлять положением этого «скользящего контакта» и, соответственно, выходным напряжением, с помощью цифровых сигналов (обычно через интерфейсы типа SPI или I²C).

В этой простой инструкции я покажу вам, как управлять цифровым потенциометром MCP41010 с помощью микроконтроллера CH32V003F4P6 через SPI интерфейс

MCP41ххх, в нашем случаи MCP41010 — Микросхема-потенциометр с цифровым управлением, изменение сопротивления происходит благодаря массиву из 256 резисторов. В серии есть потенциометры сопротивлением 10kΩ, 50kΩ и 100kΩ, MCP41010, MCP41050 и MCP41100 соответственно. Также существует сдвоенная микросхема MCP42010 с аналогичными параметрами

Удобных модулей с такой микросхемой не существует, но MCP41010 можно найти в DIP корпусе или SO8 версию, которую можно впаять в переходник на DIP8, как в моем случаи

Схема включения

-2

MCP41010:

  • 1 нога CS - чипселект интерфейса SPI, подключается на любой свободный выход CH32V003F4P6, в примере подключен к PC3
  • 2 нога SCK - тактовый вход интерфейса SPI, подключается к PC5 выходу CH32V003F4P6
  • 3 нога SI, MOSI - вход интерфейса SPI, подключается к PC6 входу CH32V003F4P6
  • 4 нога Vss - масса
  • 5, 6, 7 нога PA0, PW0, PB0 - выходы потенциометра
  • 8 нога Vdd - питание 2,7 — 5,5V

У SPI интерфейса микросхемы отсутствует нога MISO, а значит невозможно прочитать состояние ползунка потенциометра, можно только установить значение записав байт в регистр микросхемы

Пример работы

Рассмотрим пример для перебора значений потенциометра 256 раз, для установки разных значений сопротивления

Код пишем в MounRiver Studio

Функция инициализации SPI на CH32V003F4P6

void SPI_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
SPI_InitTypeDefSPI_InitStructure;
// Включение тактирования
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_SPI1,
ENABLE);

// Настройка CS на PC3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed =
GPIO_Speed_10MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_3); // CS в единицу

// Настройка SCK и MOSI
// PC5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure );
// PC6
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode =
GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOC, &GPIO_InitStructure );

// Конфигурация SPI
// двухпроводной полнодуплексный режим
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
// микроконтроллер будет ведущим
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
// за один такт отправляется/получается 1 байт
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
// полярность сигнала, в ждущем режиме 0
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
// фазы сигнала
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
// управление сигналом – программное управление
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
// скорость пердачи
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
// порядок передачи битов, старший бит первый
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
// настройка CRC
SPI_InitStructure.SPI_CRCPolynomial = 7;
// вкл
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1,
ENABLE);
}

Функции передачи данных на MCP41010

void SPI_Send(uint8_t data)
{
// Ждем готовности передатчика
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
// Отправляем данные
SPI_I2S_SendData(SPI1, data);
// Ждем завершения передачи
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
}
void MCP41100_Write(uint8_t value)
{
// Активируем CS (низкий уровень)
GPIO_ResetBits(GPIOC, GPIO_Pin_3);
// Отправляем команду и данные в MCP41100
SPI_Send(0x11); // команда
SPI_Send(value); // данные
// Деактивируем CS (высокий уровень)
GPIO_SetBits(GPIOC, GPIO_Pin_3);
// Вывод в терминал
printf("MCP41100 set to: %d\r\n", value);
}

Основная функция программы, перебираем значения на MCP41010

int main(void)
{
Delay_Init(); // Инициализация задержек
USARTx_CFG(); // Инициализация UART
SPI_Config(); // Настройка SPI
while(1) {
for(uint8_t i = 0; i <= 255; i++) {
MCP41100_Write(i); // Запись значения в потенциометр
Delay_Ms(1000);
}
}
}

Полный код программы

MCP41100.zip — Яндекс Диск

Результат

-3

MCP41010 можно использовать в разных проектах, от электронного управления громкостью до управления скоростью двигателя постоянного тока