Продовжимо знайомство з мікроконтролерами Cypress, а нині це Infineon, та
засобом розробки ModusToolBoxIDE. В цій статті пропоную розібратись, як
працювати з аналоговими блоками, такими як ADC та LPCOMP. Програмувати будемо
в засобі розробки MTB_IDE, та драйверами PDL. В попередній статті "Встановлення ModusToolBox та перший проект на CY8CKIT-149 PSoC® 4100S Plus
Prototyping Kit" розглянули як встановити MTB_IDE, та створили перший проект.
Використовувати будемо все той же ж KIT Prototyping CY8CKIT-149 PSoC4, але все що буде в цій статті, буде підходити до всіх девайсів які
підтримуються MTB та драйверами PDL.
Створення проекту
Запускаємо ModuToolBoxIDE, та створюємо новий проект як на малюнку, на швидкій
панелі тиснемо 1:
Створення нового проекту
Далі потрібно обрати мікроконтролер або плату розробника, в цьому випадку
це KIT Prototyping CY8CKIT-149 PSoC4, у вас це може бути інший чип. Головне, щоб він підтримувався та мав на
борту ADC та LPCOMP:
Вибір цілі
Обираємо серію МК - PSoC4
Обираємо плату з цієї серії
Можна переглянути документацію по цій платі
Тиснемо "Next"
Створювач проектів "Project Creator" запропонує обрати шаблон проекту з
прикладом до якоїсь периферії, або пустий проект. Обираємо пустий. Нам
потрібно з нуля розібратись зі всіма налаштуваннями і ньюансами.
Обираємо шаблон для проекту
Обираєом шаблон пустого проекту
Називаємо свій проект за смаком і своїми вподобаннями
Після того, як проект створено і він з'явився в "Project explorer", пропоную
розгорнути дерево проекту і відкрити головний файл "main.c":
Відкриваємо файл main.c
Залишилось всього трішки - дописати демо-код. Чим і займемось. Але перед тим
відкриємо зі швидкої панелі "device-configurator", та налаштуємо периферію, як
слід, для наших потреб.
Панель швидкого доступу
Побудувати проект
Очистити проект
Прошити МК і перейти в режим відладки
Залити прошивку і запустити її
Відкрити утіліту "Library Manager"
Відкрити утіліту "Device Configurator"
Саме зараз нас цікавить "Device Configurator". Запусимо його і оберемо ADC:
Обираємо ADC
Периферія
Аналогова периферія
Програмований аналог PASS
12-bit SAR ADC
Далі перейдемо до налаштувань самого ADC:
Налаштування ADC частина 1
Налаштування ADC частина 2
Оберемо опірну напругу для порівняння, таку як 3.3 Вольта
Поки обиремо 2 канали, далі можливо додамо ще каналів
Джерело тактування оберемо один з вільних дільників
Назначемо вільний та доступний пін для 0 канала
Назначемо вільний та доступний пін для 1 канала
Тиснемо "CTRL + S" та зберігаємо файл налаштувань. Ще можна переглянути що за
код згенерувався для налаштування ADC і двох каналів:
Попередній перегляд коду налаштувань
Перейдемо до вкладки "Code Preview"
Переглянемо, сам код, який генерується в проект
Зберемо такий макет для дослідження, та напишемо демо-код:
Схема макету для дослідження ADC
Демо-код ADC
Перед тим як писати демо-код, додамо бібліотеку retarget до проекту за
допомоги "Library manager", для того щоб друкувати повідомлення серіал
термінал по UART:
Додаємо бібліотеку retarget
Тиснемо вкладку "бібліотека"
Обираємо периферію
Та позначаємо необхідну бібліотеку
Оновлюємо перелік бібліотек для проекту
В початковий код додаємо бібліотеку ""cy_retarget_io.h"":
В головну функцію main додаємо ініціалізацію бібліотеки retarget для друку повідомлень в термінал:
result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
І на загал, код в файлі main.c буде виглядати таким чином:
#include "cy_pdl.h"#include "cybsp.h"#include "cy_retarget_io.h"intmain(void)
{
cy_rslt_t result;
uint16_t resADC[2];
/* Initialize the device and board peripherals */
result = cybsp_init() ;
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
result = cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Enable global interrupts */
__enable_irq();
printf("\x1b[2J\x1b[;H");
printf("*------------------------------*\r\n");
printf("* Demo ADC and LPCOMP started! *\r\n");
printf("*------------------------------*\r\n");
result = Cy_SAR_Init(SAR0, &pass_0_sar_0_config);
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
Cy_SAR_Enable(SAR0);
for (;;)
{
Cy_SAR_StartConvert(SAR0, CY_SAR_START_CONVERT_SINGLE_SHOT);
Cy_SAR_IsEndConversion(SAR0, CY_SAR_WAIT_FOR_RESULT);
resADC[0] = Cy_SAR_GetResult16(SAR0, 0);
resADC[1] = Cy_SAR_GetResult16(SAR0, 1);
printf("ADC Result Channel 0 = %d mV \r\n", Cy_SAR_CountsTo_mVolts(SAR0, 0, resADC[0]));
printf("ADC Result Channel 1 = %d mV \r\n", Cy_SAR_CountsTo_mVolts(SAR0, 1, resADC[1]));
printf("\x1b[1F");
printf("\x1b[1F");
Cy_SysLib_Delay(1000);
}
}
Заливаємо, запускаємо, відкриваємо термінал і спостерігаємо щось подібне:
Результат
Крутимо потенциометри і спостерігаємо за результатом.
Відео посібник
Вмикаємо і налаштовуємо LPCOMP
LPCOMP (Low Power Comparator) - компаратор з низьким споживанням. Відкриємо знову "device configurator" та увімкнемо і налаштуємо один з компараторів:
Вмикаємо LPCOMP
Та налаштовуємо як на цьому скріншоті:
Налаштування LPCOMP
Конфігуруємо вихід компаратора як "Direct" коли напруга на позитивному вході менша за ту, що на негативному вході, то на виході 0, і навпаки, коли на позитивному вході напруга перевищила поріг, що є на негативному вході, то на виході буде 1.
Живлення і швидкість порівняння обираємо "Normal power/Fast".
Виникає переривання в обох випадках, як по фронту, так і по спаду.
Обираємо шпильку для позитивного входу.
Обираємо шпильку для негативного входу.
Обираємо шпильку для виходу.
Обиремо, саме той пін для виходу, де є під'єднаний світлодіод, щоб наочно бачити результат порівняння вхідних напруг. Так як світлодіод під'єднаний постійно до 3.3В, то світитиме, коли на виході буде 0, а як на виході компаратора з'явиться 1 то світлодіод згасне.
Вибір шпильки для виходу компаратора
Зберігаємо зміни "CTRL+S" додаємо з'єднання компаратора і дільників.
Крутимо потенциометром на позитивному вході компаратора, і спотерігаємо, що як напруга на позитивному вході перевищує напругу на негативному вході, то вихід компаратора встановлює високий рівень і навпаки.