На главную страницу

 

Содержание

 

1. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Матричная клавиатура.

Рассмотрим работу с матричной клавиатурой. Такая клавиатура позволяет использовать меньше выводов микроконтроллера по сравнению с вариантом, когда каждая кнопка подключена к отдельному выводу. При матричном подключении на строки клавиатуры подается «бегущий ноль» (или «бегущая единица»), а со столбцов клавиатуры считываются сигналы. Если какая либо кнопка нажата, то изменяется считанный сигнал. Т.о. определяется нажатие на кнопку. Сканирование (считывание состояния и формирование сигнала «бегущий ноль»)  обычно осуществляется с помощью таймера.

                Схема подключения клавиатуры:

                Поскольку клавиатура требует для подключения обычных портов ввода-вывода, то ее подключение при разработке принципиальной схемы можно оставить на самый последний этап, когда уже другие устройства подключены, т.е. подключить на оставшиеся выводы. Поэтому пример программы сделан «универсально», есть специальные константы, которые задают порты и биты портов подключения и настройки. Для управления сбросом и установкой бит используются макросы «CLEAR_BIT» и «SET_BIT», идущие с  компилятором.

 

2. Программирование на языке С++ на примере микроконтроллера ATmega328.  Кнопка с обработкой дребезга и автоповтором нажатия, работающая с использованием прерываний.

Рассмотрим пример программы, в котором используется кнопка, при нажатии на которую производится определенное действие. Этим действием будет мигание светодиода на основе программы, рассмотренной в номере 24 (статья 7). Изменения в программе выделены серым цветом. Для обработки дребезга и автоповтора созданы специальные программные счетчики:

volatile unsigned int debounce_cnt; // счетчик времени дребезга, мс

volatile unsigned int repeat_cnt; // счетчик времени автоповтора, мс

                После обработки дребезга устанавливается флаг нажатия кнопки:

volatile unsigned char Key_Pressed = 0; // флаг обработки нажатия кнопки, 1 - нужно обработать,

который сбрасывается после отработки нужного действия.

Пример программы (скетча) приведен для «Arduino IDE» [2].

 

3. Примеры программ на С++ для персональных компьютеров.

Продолжение. Начало см. в номере 24 (статья 10).  

Для вывода принимаемых данных будем использовать элемент управления «Rich Edit 2». Он позволяет выводить текст с форматированием [1].

                Зададим индикатор элемента «IDC_RICHEDIT2_Read». Установим свойства элемента: «многострочный» - «true»,

«Только чтение» - «true»,

«Полоса прокрутки по горизонтали» - «true»,

«Полоса прокрутки по вертикали» - «true»,

«Авто VScroll» - «true»,

«Авто HScroll» - «true».

 

Инициализируем данный элемент в функции «InitInstance()» в файле приложения «Terminal_232_485.cpp», иначе приложение будет запускаться с ошибкой:

// инициализация CTerminal_232_485App

 

BOOL CTerminal_232_485App::InitInstance()

{

 

                AfxInitRichEdit2();

 

Результат приема данных:

«»[1]

 

Продолжение следует.

 

4. Программирование на языке С на примере микроконтроллера ATmega168.  Работа с памятью типа "FM24CL16".

Память типа "FM24CL16" позволяет делать практически неограниченное количество перезаписей, что позволяет использовать ее в счетчиках ресурсов, значения которых изменяются часто и требуют соответственно постоянной перезаписи.

                В примере программы считывается значение нескольких ячеек памяти, затем записываются в них новые значения и снова считываются.

Программа написана для среды разработки ATMEL Studio® [1].

Текст основной программы (все файлы проекта можно найти в приложении):

//

// Интерфейс I2С

// Память типа "FM24CL16"

//

 

// константа, которая показывает, что переменная объявляется не в этом файле

#define IDENTIFIER_NOT_EXTERN

#include "global.h"  // глобальные объявления

 

#include "UART_drv.h" // объявления для UART

 

// микросхема FM24CL16

#define FM24CL16_slave_addr 0b1010 // адрес устройства (1010)

#define I2C_WR 0 // запись

#define I2C_RD 1 // чтение

unsigned char TWSR_tmp; // для хранения TWSR

 

unsigned char FM24CL16_page_addr; // адрес страницы в FM24CL16

unsigned char FM24CL16_word_addr; // адрес ячейки на выбранной странице в FM24CL16

unsigned char FM24CL16_bytes_cnt; // счетчик записываемых/считываемых байт FM24CL16

unsigned char FM24CL16_bytes_rd_wr; // количество байт для записи/считывания FM24CL16

unsigned char FM24CL16_rd_data; // считанный байт FM24CL16

 

Результат работы программы:

FM24CL16 - чтение

adr = 0, data - ff

adr = 1, data - ff

adr = 2, data - ff

adr = 3, data - ff

adr = 4, data - ff

adr = 5, data - ff

adr = 6, data - ff

adr = 7, data - ff

adr = 8, data - ff

adr = 9, data - ff

FM24CL16 - запись

FM24CL16 - чтение после записи

adr = 0, data - 0

adr = 1, data - 1

adr = 2, data - 2

adr = 3, data - 3

adr = 4, data - 4

adr = 5, data - 5

adr = 6, data - 6

adr = 7, data - 7

adr = 8, data - 8

adr = 9, data – 9

 

 

5. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Работа с АЦП. Фотореле (программный запуск и AWD).

В журнале № 15 были рассмотрены примеры программного запуска АЦП. В данной статье рассмотрим примеры реализации фотореле также на основе программного запуска и с помощью аналогового сторожа (AWD), который по логике своего действия подходит для задачи реализации фотореле.

                Схема подключения фотоприемника к микроконтроллеру:

Пример программы сделан для компилятора «CooCox®» [4].  Отладочная плата - «STM32F4DISCOVERY» [5]. Текст основной программы (дополнительные файлы исходного кода вы можете найти в приложении):

 

// Работа с АЦП.

// Пример 3. Программный запуск. Фотореле.

//

 

#define stm32f4xx

#include "stm32f4xx.h" // описание периферии

#include "stdio.h" // описание стандартных функций

 

// определения частот шин микроконтроллера

#define CPU_CLOCK  1600000L // частота процессора

#define APB1_CLOCK 16000000L // частота шины APB1

#define APB2_CLOCK 16000000L // частота шины APB2

 

#include "DELAY_TIM6.h" // функции задержки

#include "UART3_drv.h" // объявления функций для работы с USART3

 

char msg[130]; // массив для формирования сообщений для вывода по UART

 

// АЦП

float Vref = 3.3; // опорное напряжение для АЦП

float ADC_float; // результат АЦП в виде напряжения

 

// фотореле

// пороги переключения, В

float theshold_hi = 3.2; // верхний

float theshold_lo = 1.6; // нижний

 

Изменяя освещенность датчика, наблюдайте включение и выключение светодиода на отладочной плате.

                Во втором примере рассмотрим применение AWD. AWD позволяет автоматически контролировать выход измеряемого напряжения за верхний и нижний заданный порог. AWD может быть настроен для одного регулярного и/или инжектированного канала, для всех регулярных и/или инжектированных каналов. В случае если нужны разные пороги для разных напряжений можно использовать разные модули АЦП (для одного АЦП можно задать только одну пару порогов).

 

 

6. Автоматизация поиска информации в сети интернет. Занятие 6.

В данной статье рассмотрим пример, как выбрать нужное значение в списке. Для этого нам необходимо знать например «id» списка и текст элемента списка, который нужно выбрать. Эти параметры можно определить по тексту html или с помощью инструментов браузера, показывающих параметры выделенного элемента на странице.

Пример функции и ее использования приведен ниже.

Пример использования функции в программе:

webBrowser1.Navigate("https://www.avito.ru/rossiya");

if (Timer_Timeout_Proc() == false) Trace.WriteLine("Таймаут!");

doc = webBrowser1.Document; // получить содержимое документа

// выбор категории

str = i_search.DropDown_select(doc, "category", "Резюме"); // получим адрес

// выбор региона

str = i_search.DropDown_select(doc, "region", "Екатеринбург"); // получим адрес

 

Результат работы программы:

«» [2].

 

 

7. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Работа с таймерами. Функции задержки с использованием таймера.

Функции задержки, сделанные с помощью таймера менее чувствительны к возникающим прерываниям в программе (увеличивающих реальное время задержки) по сравнению с функциями задержки, сделанными с помощью циклического выполнения команд микроконтроллера. Поскольку в микроконтроллере достаточно много таймеров, то для этой цели можно использовать таймер с малым количеством функций, например TIM6 или 7 (хотя можно сделать аналогично и на остальных).

                Однако некоторая проблема поджидает нас в «тени» регистров.

Пример программы сделан для компилятора «CooCox®» [4].  Отладочная плата - «STM32F4DISCOVERY» [5]. Ниже приведены тексты файлов для задержек и тестового примера.

 

 

8. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Таймеры. Работа с пьезокерамическими излучателями.

Рассмотрены примеры программ генерации сигнала фиксированной частоты и переменной частоты с задаваемой длительностью звучания сигнала.

Используются платы «STM32F4DISCOVERY» [5], «163» и «145B» .

Пример программы сделаны для компилятора «CooCox®» [4].

 

 

9. Программирование на языке С++ на примере микроконтроллера ATmega328.  Работа с сетью Ethernet.

Наиболее недорогим способом подключения устройства к проводной локальной сети «Ethernet» является использование контроллера ENC28J60 [5].  На базе этой микросхемы выпускается много модулей, включающих в себя собственно микросхему с обвязкой, сетевой разъем и разъем для подключения к другим платам. Рассмотрим пример управления светодиодом и серво. Фото макета представлено на рисунке:

 

Подключение элементов макета:

Цепь

Вывод

Обозначение порта микроконтроллера

плата с ENC28J60

 

 

VCC      

3.3V

 

GND     

GND

 

SCK       

Pin 13

PB5

SO         

Pin 12

PB4

SI           

Pin 11

PB3

CS          

Pin 8

PB0

~Reset

Pin 7

PD7

Светодиод

 

 

LED_R

Pin 2

PD2

Серво

 

 

VCC      

5V

 

GND     

GND

 

Pulse

Pin 9

PB1

Часто вывод сброса «~Reset» не подключают, но для надежности работы устройства это необходимо сделать.

В общем задача состоит в том, чтобы послать из программы на компьютере запрос на сервер, который реализован на плате с модулем на ENC28J60.

Если в строке браузера набрать например «http://192.168.0.10/?led_off»:

«» [7], то посылаемый запрос будет выглядеть следующим образом:

«

GET /?led_off HTTP/1.1

Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*

Accept-Language: ru-RU

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0;

»

Т.е. введенный нами запрос дополняется специальной информацией.

Ответ, которым будет сформирован сервером, записан далее в программе микроконтроллера.

Для работы с микросхемой ENC28J60 будем использовать библиотеку «ethercard». Пример программы (скетча) приведен для «Arduino IDE» [2]:

Управляющая программа написана на языке С# [6]:

Вид окна программы при разных ответах сервера:

«

» [6]

 

 

10. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Схема захвата. Измерение параметров ШИМ сигнала.

Задача измерения параметров ШИМ сигнала может возникнуть в следующих случаях:

- получения информации с датчиков (температуры, холла, энкодеров и др.) с ШИМ выходом

- создания диагностических автомобильных устройств (SAE J1850)

- самодиагностика устройств с выходным ШИМ сигналом

В микроконтроллере существует специальный режим захвата, позволяющий одновременно измерять период и длительность импульсов ШИМ, который называется «PWM input mode» [2]. В этом режиме используются одновременно две схемы захвата, одна измеряет период, вторая длительность, также производится автоматический сброс счетчика таймера при начале периода ШИМ сигнала. ШИМ сигнал подается на один вывод микроконтроллера, а внутри производится его коммутация на разные схемы захвата.

Будем использовать плату «STM32F4DISCOVERY» [5]. Пример программы сделан для компилятора «CooCox®» [4]. На таймере TIM4 сделан ШИМ генератор, а на таймере TIM2 схема измерения параметров ШИМ сигнала. Соответственно на плате необходимо соединить ножки PD12 (выход генератора) и PA0 (вход измерителя).

Результат работы программы:

Захват. Измерение параметров ШИМ сигнала:

Период = 100 мкс, Длительность = 24 мкс

Период = 100 мкс, Длительность = 24 мкс

Период = 100 мкс, Длительность = 24 мкс