В цьому дописі пропоную спробувати вже PSoC4 CY8CKIT-045S. Плата має ARDUINO сумісний роз'єм і щоб не збирати макет з купою дротів,
скористаємось нагодою і спробуємо провести експерименти з мультифункціональною
дошкою для ARDUINO сумісного форм-фактору.
Макет для дослідження
Зручно, без дротів, приєднати дошку з різноманітною периферією, до дошки з
мікроконтролером і зосередитись на програмуванні. Але все ж таки, ще потрібно
додати 2 сервомашинки. Для них є спеціальний роз'єм на дошці з шпильками D7, D8.
Все інше, а це: фоторезистор A1, змінний резистор A0, кнопка D2 і світлодіод D12
або D13 є в наявності на платі. Ні паяти, ні припасовувати дроти, не потрібно.
Створюємо проект
Відкриваємо ModusToolBox, створюємо проект, обираємо свій мікроконтролер, в
нашому випадку це CY8CKIT-045S:
Обираємо потрібний мікроконтролер
Далі обираємо шаблон проекту як "пустий проект":
Обираємо шаблон проекту
Та даємо назву проекту, наприклад "CY8CKIT-045S_ADC_PWM".
Подвійним кліком миші розгортаємо дерево проекту в провіднику проектів
"Project Explorer" відкриваємо головний файл "main.c":
Відкриваємо файл main.c
В панелі швидкого доступу запускаємо "Device Configurator" і займемось
налаштуванням потрібної периферії:
ADC
Для цього проекту нам знадобиться один ADC з двома 12-бітними каналами.
Шпильки A0, A1 з яких будемо зчитувати аналогові сигнали будуть доступні для
ADC1:
Увімкнення ADC
Вмикаємо PASS 1 12-bit SAR ADC 0
Даємо йому псевдонім (Alias), як "ADC_1", тоді зручно буде ним оперувати в
коді
Перейдемо до налаштувань ADC, це виглядає таким чином:
Налаштування ADC
Обираємо джерело опорної напруги як Vdda, це буде 3.3V
Встановлюємо два канали (для змінного резистора і фоторезистора)
Обираємо якийсь вільний дільник як джерело тактування
Трішки нижче будуть розділи для налаштування каналів, їх буде 2. Єдине що
потрібно зробити це обрати шпильки з яких будемо читати аналоговий сигнал.
Це шпильки A0 і A1, тут в BSP вони позначаються як CYBSP_A0 і CYBSP_A1.
Обираємо саме їх:
Налаштування каналів ADC
Червоним позначив на що звернути увагу, щоб було так само для нашого,
конкретного, прикладу.
PWM
В нашому прикладі-демонстрації, задіяно два сервопривода. Тому налаштуємо два
таймери в режимі PWM. Нас цікавлять саме ті таймери в яких є доступ до шпильок
D7 і D8, а це "TCPWM 16-bit Counter 4, 5":
Увімкнення двох TCPWM
Активуємо лічильник 4 і 5
Обираємо режим PWM
Даємо їм псевдоніми (Alias) такі як "SERVO1", "SERVO2", надалі в коді буде
зручно звертатись до них по псевдоніму
Перед тим як перейдемо до налаштувань PWM, спочатку налаштуємо дільник з якого
будуть наші PWM тактуватись. Перейдемо до вкладки "Peripheral-Clock" і оберемо
окремий "divider" для потреб PWM:
Налаштування джерела тактування для PWM
Оберемо вільний дільник, в прикладі це "16 bit Devider 2", та дамо йому
псевдонім (Alias), як PWM.
Дивимось яка частота на вхід дільника приходить, в нашому випадку це 48МГц
Назначаємо значення для дільника, як 48,
На виході дільник буде 1МГц (48МГц/48 = 1МГц). Саме від цієї частоти будуть
тактуватись TCPWM.
Спочатку тут ще нічого не буде, тому що від якого дільника
тактуватись PWM визначемо в наступному кроці.
Повертаємось до налаштувань PWM, для двох PWM будуть однакові налаштування, то
ж покажу як налаштувати один канал PWM, а інший буде мати абсолютно такі ж
значення:
Налаштування PWM каналу
Режим таймера PWM
В нашому випадку дільник 1, не рухаємо
Період 19999. Тактуємось від джерела в 1МГц. А для серви потрібна частота
50Гц, а це 0.02 секунди. Тому 1000000*0.02=20000. Так як в лічильник рахує з
0, то 20000-1=19999.
Серва працює від довжини періоду і має крайні значення періоду ~0.5 - 2.5
мілісекунди, а це будуть значення для "Compare" від 500-1=499 до
2500-1=2499. Початкове значення виставляємо не крайове, щоб точно знати що
позиція сервомашинки не виходить за межі фізичного обмеження, тому обрав
значення як - 999.
От тут вже і обираємо "16 bit Divider 2 clk (PWM)", який ми попередньо
налаштували на 1МГц.
Та оберемо саме на які шпильки буде подаватись сигнал PWM, як на малюнках нижче:
GPIO
З вкладки "Peripheral" перейдемо до вкладки "Pins" і налаштуємо дві шпильки.
D2 як вхід з перериванням, а D12 на вихід:
Вмикаємо GPIO
Цим шпилькам призначений вже псевдонім (Alias), такий як CYBSP_D12 який
відповідає P5_1 шпильці і CYBSP_D2 який відповідає P5_5 шпильці. В коді ми
будемо звертатись по псевдонімам до цих шпильок.
Налаштування для кнопки з перериваннями CYBSP_D2 виглядає так:
Налаштування кнопки з перериванням
Режим вхід з підтяжкою до плюса "Resestive Pull-Up. Input buffer on"
Початкове значення високий рівень "High(1)"
Винекниння переривання по спадаючому фронту "Falling Edge"
Налаштування шпильки для світлодіода виглядатиме так:
Налаштування шпильки світлодіода
Режим на вихід "Strong Drive. Input buffer off"
Початкове значення "Low(0)". Світлодіод вимкнено.
З налаштуваннями периферії покінчено, можемо зберегти зміни за допомоги
гарячих комбінацій - CTRL+S і перейти до створення коду-демонстрації
Демо-код
Для того щоб було зручно друкувати повідомлення в серіал-термінал за допомоги "printf" потрібно додати бібліотеку "cy_retarget_io.h". Запускаємо "Library manager" і додаємо:
Додаємо "cy_retarget_io"
Робимо всі кроки як на малюнку і перейдемо до кодування нашого демо-проекту. Відкриємо файл "main.c".
Початково він виглядатиме так:
#include "cy_pdl.h"#include "cybsp.h"intmain(void)
{
cy_rslt_t result;
/* Initialize the device and board peripherals */
result = cybsp_init() ;
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* Enable global interrupts */
__enable_irq();
for (;;)
{
}
}
А тепер можна додати демо-код, який я надам нижче. Розписувати кожен рядок не має сенсу, все доволі просто. А кому цікаво, або не зрозумілі якісь деталі то
перегляньте відео-посібник в кінці цієї статті, де я відтворю всі кроки створення налаштування та кодування - детальніше.
То ж коли додамо демо-код, то наш файл "main.c"
виглядатиме так:
Компілюємо, заливаємо, спостерігаємо. Резистором на A0 крутимо одну серву, а інша серва приймає положення в залежності від освітлення фоторезистора на A1. Кнопкою на D2 міняємо місцями серви.
Продовжимо знайомство з мікроконтролерами 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" додаємо з'єднання компаратора і дільників.
Крутимо потенциометром на позитивному вході компаратора, і спотерігаємо, що як напруга на позитивному вході перевищує напругу на негативному вході, то вихід компаратора встановлює високий рівень і навпаки.
На фоні різкого здорожчання чипів STM32, та їх дефіциту, на часі розглянути
якісь альтернативи. Звісно, тієї ж вагової категорії. Це має бути 32 розрядний
MCU, та архітектури ARM. Пропоную до вашої уваги дошку розробника
KIT Prototyping CY8CKIT-149 PSoC4
від компанії
Cypress + Infineon.
Розписувати характеристики і опис дублюючи документацію - не бачу сенсу.
Можете самі перейти за наданими ланками і ознайомитись більш детально.
CY8CKIT-149 PSoC® 4100S Plus Prototyping Kit
Мета цієї статті:
показати як встановити засіб розробки Eclipse ModusToolBox IDE
створення проекту "Hello, World" для ознайомлення з процесом розробки
Встановлення ModusToolbox
Перейдіть за ланкою, щоб завантажити
ModusToolbox, та оберіть вашу операційну систему. ModusToolBox доступний для Windows,
Linux, macOS. Ну звісно, це ж Eclips :) Після завантаження, встановіть
ModusToolBox.
Встановлення без особливостей, достатньо:
тиснути "Next"
погодитись з ліцензійною угодою
залишити шлях встановлення за замовчуванням, або вказати свій шлях (шлях
не має містити кирилічні символи)
обрати тип інсталяції "Default installation"
кнопкою "Finish" завершити інсталяцію та запускаємо ModusToolBox
Завершення встановлення
Оберіть свій WorkSpaces, тека де будуть зберігатись ваші проекти, або
залиште як є:
Обираємо шлях workspaces
Тиснемо кнопку "Launch" і перейдемо до створення першого проекту "Hello
World" надрукуємо текстовий рядок в серіал порт та поблимаємо світлодіодами.
А світлодіодів на цій платі розробника дуже багато :)
Створення нового проекту
Створення нового проекту
Створення нового проекту:
На панелі швидкого доступу "Quick panel"
Тиснемо "New Application". Запуститься утіліта "Project Creator"
Обираємо свою дошку розробника "CY8CKIT-149" з чипом CY8C4147AZI-S475
Тиснемо кнопку "Next"
Обираємо приклад з репозиторію
5. Переконаємось чи вірний шлях
6. Оберемо приклад "Hello World"
7. Та назвемо його "PSoC4_Hello_World"
8. Ознайомимось з описом прикладу
9. Підсумуємок, що створили
10. Тиснемо кнопку "Create"
Структура проекту
Коли проект створиться, то в "Workspaces" створяться дві теки "mtb_shared" з
бібліотеками, які будуть доступні всім проектам в цьому "Workspaces" та тека,
власне, з самим проектом. В нашому випадку це "PSoC4_Hello_World":
Структура проекту
mtb_shared - тека з бібліотеками, які доступні будь якому проекту в цьому
workspaces
pdl (peripheral driver library) та hal (high abstraction level) бібліотеки
PSoC4_Hello_World - тека з проектом який ми створили
COMPONENT_CUSTOM_DESING_MODUS - тека яка стосується утіліти Device
Manager. Про це в наступних статтях.
Файл main.c - тут і будемо дивитись/писати код
Панель швидкого доступу. Ознайомимиось з нею нижче.
Панель швидкого доступу
Для кожного проекту в "workspaces" викликається своя панель швидкого доступу.
Де можна швидко знайти всі необхідні речі для роботи над цим проектом:
Панель швидкого доступу
Побудувати і очистити проект
Запустити відладку або просто залити прошивку за допомоги Jlink або
KitProg3
Викликати утіліти, наприклад Library Manager, Device Configurator, тощо
Та швидкий доступ до документації на саму дошку розробника, всіх
бібліотек, що дуже зручно
Приклад Hello World
Подвійним кліком на файлі main.c відкриємо файл на редагування, та перш за
все, пропоную побудувати проект, натиснувши в панелі швидкого доступу "Quick
panel" -> "Build PSoC4_Hello_World Application". Це для того щоб
переконатись що з проектом все гаразд і всі файли створились як слід, та щоб
всі інклюди, змінні, функції, дефайни і таке інше проіндесувались. Як приклад зібрався без помилок, тиснемо на панелі швидкого доступу "PSoC4_Hello_World program (KitProg3_MiniProg4)". Прошивка заллється до мікроконтролеру і почне працювати. В серіал порт один раз надішлеться текстове повідомлення "Hello World", та почне блимати набортний світлодіод.
Сам файл main.c виглядає так. Він, приклад, побудований на бібліотеці PDL,
більш низького рівня чим HAL бібліотека.
/******************************************************************************* File Name: main.c** Description: This is the source code for the PSoC 4 MCU Hello World Example* for ModusToolbox.** Related Document: See README.md********************************************************************************* (c) 2020, Cypress Semiconductor Corporation. All rights reserved.******************************************************************************** This software, including source code, documentation and related materials* ("Software"), is owned by Cypress Semiconductor Corporation or one of its* subsidiaries ("Cypress") and is protected by and subject to worldwide patent* protection (United States and foreign), United States copyright laws and* international treaty provisions. Therefore, you may use this Software only* as provided in the license agreement accompanying the software package from* which you obtained this Software ("EULA").** If no EULA applies, Cypress hereby grants you a personal, non-exclusive,* non-transferable license to copy, modify, and compile the Software source* code solely for use in connection with Cypress's integrated circuit products.* Any reproduction, modification, translation, compilation, or representation* of this Software except as specified above is prohibited without the express* written permission of Cypress.** Disclaimer: THIS SOFTWARE IS PROVIDED AS-IS, WITH NO WARRANTY OF ANY KIND,* EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, IMPLIED* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress* reserves the right to make changes to the Software without notice. Cypress* does not assume any liability arising out of the application or use of the* Software or any product or circuit described in the Software. Cypress does* not authorize its products for use in any products where a malfunction or* failure of the Cypress product may reasonably be expected to result in* significant property damage, injury or death ("High Risk Product"). By* including Cypress's product in a High Risk Product, the manufacturer of such* system or application assumes all risk of such use and in doing so agrees to* indemnify Cypress against all liability.*******************************************************************************//******************************************************************************* * Include header files ******************************************************************************/#include "cy_pdl.h"#include "cybsp.h"/******************************************************************************** Macros*******************************************************************************/#define LED_DELAY_MS (500u)#define CY_ASSERT_FAILED (0u)/******************************************************************************** Function Name: main********************************************************************************* Summary:* System entrance point. This function performs* - initial setup of device* - configure the SCB block as UART interface* - prints out "Hello World" via UART interface* - Blinks an LED under firmware control at 1 Hz** Parameters:* none** Return:* int********************************************************************************/intmain(void)
{
cy_rslt_t result;
cy_stc_scb_uart_context_t CYBSP_UART_context;
/* Initialize the device and board peripherals */
result = cybsp_init();
/* Board init failed. Stop program execution */if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(CY_ASSERT_FAILED);
}
/* Configure and enable the UART peripheral */
Cy_SCB_UART_Init(CYBSP_UART_HW, &CYBSP_UART_config, &CYBSP_UART_context);
Cy_SCB_UART_Enable(CYBSP_UART_HW);
/* Enable global interrupts */
__enable_irq();
/* Send a string over serial terminal */
Cy_SCB_UART_PutString(CYBSP_UART_HW, "Hello world\r\n");
for(;;)
{
/* Toggle the user LED state */
Cy_GPIO_Inv(CYBSP_USER_LED1_PORT, CYBSP_USER_LED1_PIN);
/* Wait for 0.5 seconds */
Cy_SysLib_Delay(LED_DELAY_MS);
}
}
/* [] END OF FILE */
Пропоную ознайомитись з задіяними в цьому прикладі функціями та структурами.
Як побудоване налаштування пінів і периферії. Спробувати внести в приклад свої
зміни. Ознайомитись з результатами, своїх внесків в код, шляхом заливки оновленої прошивки.
Ще я підготував відео в підтримку до цієї статті, де покажу як встановити "ModusToolBox", створю пустий проект, та напишу більш цікавий приклад мікроконтролерного "Hello World", за допомоги, вже, HAL бібліотек.