В цьому дописі пропоную спробувати вже 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 міняємо місцями серви.