Засыпкин С.В.
Лаборатория электроники и
программирования
Электронный журнал с приложениями
№ 20
© Засыпкин С.В., 2011-2014
Содержание
1. Программирование на языке С на примере микроконтроллера ATmega168. Программный ШИМ.
Если для реализации нескольких каналов ШИМ не хватает аппаратных ШИМ каналов или данные выводы заняты другой периферией, то можно сделать программный ШИМ. Программный ШИМ строится на основе какого-нибудь таймера. Необходимо определить параметры ШИМ – разрядность и частоту и настроить соответствующим образом аппаратный таймер. Затем необходимо сделать переменные для счета периода ШИМ и задания длительности.
…
2. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Работа с акселерометром LIS3DH.
Рассмотрим работу с акселерометром на примере LIS3DH [14]. Акселерометр может подключаться по интерфейсам SPI® или I2C®. Рассмотрим подключение по I2C. Акселерометр может выдавать сигнал готовности измеренных данных на вывод INT1, по которому можно начинать считывание данных. Поскольку необходимо получить данные по 3-м осям, то необходимо считать последовательно 6 регистров, в которых они находятся. Особенностью данного акселерометра является то, что для того, чтобы был инкремент адреса при считывании, необходимо установить в старшем бите байта адреса регистра «1».
Схема подключения акселерометра:
Для инициализации акселерометра напишем функцию, в которой установим требуемую частоту оцифровки сигнала (следует учесть, что частота оцифровки задается одной из нескольких дискретных значений), диапазон измеряемых ускорений и запрограммируем выход INT1. Ниже приведен пример программы, которая инициализирует акселерометр на получение значений в частотой 1 Гц по всем трем осям и передает измеренные значения по UART в терминальную программу. Программа написана для IDE «CooCox ®» [4].
…
3. Программирование на языке
С. Поиск ошибок в программах. Часть 2.
Для работы с массивами в языке «С» часто используются указатели. Поскольку компилятор не может распознать ситуацию, когда адрес, заданный указателем, выйдет за пределы памяти, выделенной массиву, то возможны различные «странные» варианты поведения программы. При записи данных из другой области программа может изменять данные, которые влияют на работу другой части программы. Особенно часто эти проблемы возникают в сложных многофункциональных программах.
…
4. Примеры программ на С++ для персональных компьютеров.
Рассмотрим пример создания приложения, которое принимает данные по COM порту и записывает их в файл на компьютере.
…
Вид окна программы:
«
» [1].
5. Оптимизация программ. Часть 1.
В данном цикле статей будут рассматриваться способы оптимизации программы для увеличения скорости работы программы или уменьшения занимаемого ею объема памяти.
Сегодня рассмотрим задачу передачи данных по UART.
…
6. Многофункциональный адаптер
«137». Часть 3.
Продолжение (начало см. в № 5, 6).
Рассмотрим как подключить адаптер для программирования в среде «CodeVisionAVR» [8].
В данной среде нет возможности подключить адаптер как какой-либо программатор. Но есть возможность после получения «hex» файла запустить какую-нибудь программу. Необходимо разместить управляющую программу для программатора и «bat» файл в папку, где формируется файл «hex» проекта. Далее настроить пути в конфигурации проекта:
«»
[8]
После компиляции появится кнопка запуска программы:
«
»
[8]
При нажатии на нее запустится процесс программирования.
Аналогично можно настроить программирование в проекте на «Atmel Studio» [9]:
…
7. Программирование на языке С на примере микроконтроллера STM32F407VGT6.
Работа с
UART.
Передача данных с помощью DMA.
Для настройки работы передачи с DMA необходимо установить в настройках UART бит DMAT. И собственно настроить DMA. В основной программе сформируем массив для передачи данных, сбросим флаг окончания передачи DMA, разрешим работу DMA и дождемся установки флага окончания передачи. Программа написана для IDE «CooCox ®» [4].
…
//
//
DMA1 - инициализация
//
void DMA1_init(void)
{
RCC->AHB1ENR |=
RCC_AHB1ENR_DMA1EN; // включить тактовый
генератор DMA1
DMA1_Stream3->CR
|= (4<<25); // канал 4 (Channel4)
DMA1_Stream3->CR |=
(1<<10); // включим инкремент адреса памяти
DMA1_Stream3->CR |=
(1<<6); // передача из памяти в периферийное устройство
DMA1_Stream3->NDTR = BYTES_NUM;
// зададим число байт для передачи
DMA1_Stream3->PAR =
(uint32_t)(&USART3->DR); // адрес периферийного устройства (регистр
данных DR)
DMA1_Stream3->M0AR
= (uint32_t)(&BYTES); // адрес начала памяти
}
…
8. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Работа со сдвиговыми регистрами 74HC595.
Рассмотрим работу с интерфейсом SPI на примере работы со сдвиговыми регистрами типа 74HC595 для управления светодиодными индикаторами. Программы написаны для IDE «CooCox ®» [4].
…
9. Программирование на языке С на примере микроконтроллера STM32F407VGT6. Работа с акселерометром LIS302DK.
Рассмотрим работу с акселерометром LIS302DK
[9]. Данный акселерометр может работать по интерфейсам SPI® и I2C®.
При включении питания устанавливаются следующие основные параметры
акселерометра [9]:
-
Акселерометр
выключен
-
Частота оцифровки 100 Гц
-
Измерения по всем осям разрешены
-
Полный масштаб измерений выключен
-
Интерфейс SPI
-
Фильтрация выключена
-
Прерывания выключены
Для начала работы с
акселерометром, его необходимо включить с помощью установки бита «PD» в регистре «CTRL_REG1». После этого можно считывать
значения регистров ускорений «OUT_X», «OUT_Y» и «OUT_Z».
…
10. Программирование на языке С на примере микроконтроллера STM8S003K3T6. Работа с АЦП.
«Аналого-цифровой
преобразователь» (АЦП), по-английски «analog to digital converter»
(ADC) предназначен для преобразования аналогового сигнала в цифровой код,
соответствующий значению измеряемого сигнала. Преобразователь измеряет
напряжение. Основными характеристиками АЦП являются:
1. Разрешение (количество бит в получаемом цифровом
результате), обычно это 8, 10, 12 бит. Чем больше разрешение, тем больше
возможный диапазон измеряемого сигнала или точность измерения. Например, при
10-битном разрешении количество различных уровней сигнала составляет 2^10 =
1024, а при 8-битном только 2^8 = 256. Таким образом, при измерении
например, входного сигнала от 0 до 5В, при 10-битном разрешении получим
точность измеряемого напряжения 5В/1024 = 0,00488В, а при 8-битном 5В/256 =
0,0195В, т.е. в 4 раза меньше.
…