Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Прокачивай своего викинга, срази всех врагов и доберись до Одина!

Викинги Вальхалла

Мидкорные, Приключения, Ролевые

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
51
ChipCraft
ChipCraft
Инженериум DIY

Энкодер на базе HEDR и STM32⁠⁠

1 месяц назад

Всем привет!

В данной статье я хочу Вам рассказать про датчик HEDR(от компании avago technologies) - это двухканальный инкрементальный оптический датчик, предназначен для измерения пройденного пути, линейной скорости, угловой скорости и направлении вращения вала.
С помощью данного датчика будет реализован энкодер на базе микроконтроллера STM32, который будет производить вычисление пройденного пути.

В данной статье будет рассмотрено:

  • Принцип работы датчика HEDR-5420-ES214;

  • Схема подключения к микроконтроллеру STM32;

  • Программная реализация (расчет пройденного пути и вывод информации на дисплей).

Технические характеристики датчика HEDR-5420-ES214

Документация на датчик

  • Напряжение питания [ 4.5 - 5.5В ];

  • Тип выхода [ квадратурный ];

  • Диаметр вала [ 5 мм ];

  • Разрешение [ 200 отсчетов на оборот ];

  • Рабочая температура [ от -10°C до +85°C ].

Принцип работы датчика HEDR-5420-ES214

Устройство состоит из трех основных компонентов:

  • Источник света (светодиод, формирующий поток света);

  • Оптическая система (линза, обеспечивает фокусировку и отражение света);

  • Фотодетектор.

Линза фокусирует излучаемый свет на кодовое колесо (диск с чередующимися отражающими и неотражающими участками), при вращении диска, отраженный свет проходит обратно через оптическую систему и попадает на фотодиоды, таким образом на их поверхности формируется чередующийся рисунок света и тени, соответствующий узору кодового диска.

Эти изменения интенсивности света преобразуются в внутренние сигналы А и В, которые проходят через компараторы в составе обработки сигналов, на выходе формируются два цифровых прямоугольных сигнала - канал А и В, находящиеся в квадратурной фазе на 90°, что позволяет микроконтроллеру определять направление вращения вала, к примеру:

  • если канал А опережает канал B - вращение происходит в одну сторону;

  • если канал B опережает канал А - вращение происходит в противоположную сторону.

Для своей задачи применяется следующая последовательность, если канал А опережает канал B - движение энкодера считается положительным, если на оборот, то движение будет отрицательным.

Осциллограмма данных полученных с датчика HEDR-5420-ES214

Осциллограмма данных полученных с датчика HEDR-5420-ES214

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

Схема подключения HEDR и дисплея к микроконтроллеру STM32F030CCT6

Схема подключения HEDR и дисплея к микроконтроллеру STM32F030CCT6

 Макет STM32F030CCTx и HEDR

Макет STM32F030CCTx и HEDR

В данной схеме используются преобразователь напряжения DA1 (+12V +5V) и стабилизатор напряжения DA2, дисплей подключается к выводам МК 21_SCL_I2C2 и 22_SDA_I2C2, датчик HEDR подключается к выводам МК 29_CH.A и 30_CH.B, данные сигналы сначала проходят через делители, R17-R18-[CH.A] и R15-R16-[CH.B], так как датчик работает от +5V, сигналы соответственно тоже у него +5V, я всегда стараюсь дополнительно защитить МК, после делителя амплитуда сигналов снизится до +3.3V, копипастить информацию по описанию узлов преобразователя, стабилизатора, узла обвязки напряжения питания и резонатора для МК не особо хочется, поэтому кому интересно можно почитать статью [Модуль обработки и коммутации данных, с внешними управляющими устройствами по RS-485 на STM32]
Настройка микроконтроллера STM32F030CCTx в CubeIDE

Настройка RCC и SYS (в RCC выбираю Crystal/Ceramic Resonator, так как у меня внешний кварц на 8 МГц)

Настройка дисплея

Взаимодействие дисплея с МК будет через I2C2

Настройка выводов узла подключения датчика HEDR

  • TIM1_CH1 (к данному выводу будет подключаться сигнал CH.A);

  • TIM1_CH2 (к данному выводу будет подключаться сигнал CH.B).

Таймер используется в режиме Encoder mode - это специальный аппаратный режим, который позволяет микроконтроллеру автоматически подсчитывать импульсы от инкрементального датчика и определять направление вращения, данная конфигурация освобождает МК от необходимости программно обрабатывать прерывания по каждому импульсу.

Encoder Mode TI1 and TI2 данный параметр указывает, что используется оба канала датчика (A и B), это дает разрешение X4 - т.е. счетчик будет увеличиваться на 4 шага за один полный оборот.

Описание режимов

TI1 - подсчет ведется по фронту одного канала А, направление определяется по уровню В, разрешение 1.8 градусов;

TI2 - аналогично логике TI1, но базируется на канале В;

TI1 and TI2 - подсчет ведется на каждом фронте обоих каналов (А+, А-, В+, В-), направление определяется автоматически, т.е. количеством импульсов на оборот 200, я получаю 800 шагов на оборот, разрешение будет 0.45 градусов.

Input Filter - включает цифровую фильтрацию входного сигнала, помогает убрать дребезг и шум, значения от 0 до 15, чем выше значение, тем надежнее фильтрация, но будет повышаться задержка.

Polarity (Rising Edge) - счетчик реагирует на восходящие фронты сигнала.

Настройка Clock

Программная реализация ведомого устройства

Ссылка на скачивание исходного кода [ https://t.me/ChipCraft В закрепленном сообщении [ #исскуствомк_исходный_код — Исходный код для Encoder_HEDR_5420_STM32F030CCTx].

Модуль process_Encoder

Данный модуль реализует считывание сигналов с инкрементального датчика HEDR и вычисляет:

  • Количество импульсов на оборот;

  • Пройденную дистанцию;

  • Отображение данных на дисплее.

#define ENCODER_MODE_X4 4

Данный параметр отражает режим подсчета импульсов, привожу формулу

Этот режим обеспечивает максимальную точность - 0.45 на один шаг.

#define WHEEL_DIAMETR_M 0.230f // 230 мм
#define WHEEL_RADIUS_M (WHEEL_DIAMETR_M / 2.0f)

Здесь я задаю геометрические размеры колеса, на валу которого установлен датчик%

Диаметр колеса 230 мм (0.230м);

Радиус вычисляется так:

#define STEPS_PER_REV (ENCODER_PPR * ENCODER_MODE_X4)

Максимальное количество шагов за один оборот

#define CIRCUMFERENCE_M (2.0f *M_PI * WHEEL_RADIUS_M)

Длина окружности колеса - это путь, который проходит колесо за один оборот

т.е. при моем радиусе 0.115, получится за один полный оборот 0.72 м.

Перейти к видео

Функция display_init() - инициализация дисплея

  • Инициализируется драйвер дисплея;

  • Выполняется заливка экрана черным цветом;

  • На дисплее на 2 секунды отображается стартовый экран с надписью ''ChipCraft";

  • После задержки экран очищается для дальнейшей работы.

библиотеку для работы с дисплеем я взял с [https://github.com/afiskon/stm32-ssd1306/tree/master]

Функция display_update()

Отвечает за визуализацию информации на дисплее:

  • Экран предварительно очищается с помощью ssd1306_Fill(Black);

  • В верхней части по центру отображается надпись «Encoder»;

  • Ниже последовательно выводятся:

    • количество импульсов;

    • дистанция;

  • Буфер графики передается на дисплей вызовом ssd1306_UpdateScreen()

Функция encoder_Handler()

Логика работы:

  • считывание текущего значения таймера;

  • определение разницы (delta) между текущим и предыдущим значениями;

  • накопление общего счетчика enocoder_position;

  • вызов функций для вычисления дистанции и обновление дисплея.

Функция get_distance_m() - вычисление пройденной дистанции

Переводит количество импульсов датчика в физическую длину пути в (метрах).

process_Encoder.c

#include "./Project/process_Encoder.h"
#include "./Project/shared.h"
#include "./Project/ssd1306.h"
#include "./Project/ssd1306_fonts.h"
#include "main.h"
#include <stdlib.h>//abs
#include <string.h>//memset
#include <stdio.h>
#include <stdint.h>
#include <math.h>

#define ENCODER_PPR 200 // импульсов на оборот
#define ENCODER_MODE_X4 4

#define WHEEL_DIAMETR_M 0.230f // 230 мм
#define WHEEL_RADIUS_M (WHEEL_DIAMETR_M / 2.0f)

#define STEPS_PER_REV (ENCODER_PPR * ENCODER_MODE_X4)
#define CIRCUMFERENCE_M (2.0f *M_PI * WHEEL_RADIUS_M)

uint16_t current_count= 0;
int16_t delta = 0;
float distance = 0.0f;
int32_t encoder_position = 0;

uint8_t ssd1306_buffer[SSD1306_BUFFER_SIZE];


void display_init(void) {
ssd1306_Init();

ssd1306_Fill(Black);
ssd1306_SetCursor(20, 25);
ssd1306_WriteString("ChipCraft", Font_11x18, White);
ssd1306_UpdateScreen();

HAL_Delay(2000);

ssd1306_Fill(Black);
ssd1306_UpdateScreen();
}

void encoder_Handler(void) {

static uint16_t last_count = 0;
current_count = __HAL_TIM_GET_COUNTER(&htim1);

delta = (int16_t)(current_count - last_count);
encoder_position += delta;

last_count = current_count;

get_distance_m();

display_update(encoder_position, distance);

}
void display_update(int32_t pulses, float distance) {

char buf[32];

ssd1306_Fill(Black);

ssd1306_SetCursor(25, 2);
ssd1306_WriteString("Encoder" ,Font_11x18, White);

sprintf(buf, "Pulses: %ld", pulses);
ssd1306_SetCursor(2, 22);
ssd1306_WriteString(buf, Font_7x10, White);

sprintf(buf, "Dist: %.2f m", distance);
ssd1306_SetCursor(2, 36);
ssd1306_WriteString(buf, Font_7x10, White);

ssd1306_UpdateScreen();
}

float get_distance_m(void){

distance = ((float) encoder_position / STEPS_PER_REV) * CIRCUMFERENCE_M;

return distance;
}

Модуль proj_main() - главный метод

  • Выполняется инициализация дисплея;

  • Запуск таймера;

  • Запуск функции encoder_Handler().

proj_main.c

#include "./Project/shared.h"
#include "./Project/proj_main.h"
#include "./Project/process_Encoder.h"
#include "./Project/process_Encoder.h"

void proj_main()
{
volatile const char *ch = ";V-F-BIN;ver: "VER_PROG(VER_a,VER_b,VER_c);(void)ch;//0x8008b00

display_init();

HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);

while (1){

//хэндлеры
encoder_Handler();

}//while (1)
}


Если статья показалась Вам интересной, буду рад выпустить для Вас еще множество статей исследований по всевозможным видам устройств, так что, если не хотите их пропустить — буду благодарен за подписку на мой ТГ-канал.

Показать полностью 13 1
[моё] Инженер Программирование Stm32 Датчик Микроконтроллеры Схема Видео Вертикальное видео Короткие видео Длиннопост
9
10
ChipCraft
ChipCraft
Лига Новых Технологий

Практическая реализация энкодера с использованием датчика HOA0902 и STM32⁠⁠

2 месяца назад

В системах точного позиционирования и измерения угла поворота оптические энкодеры остаются критически важным компонентом, обеспечивающим обратную связь по положению. Среди множества датчиков данной категории, будет рассмотрен HOA0902-11 - это двухканальный фотодатчик, предназначенный для высокоточного измерения углового положения, скорости и направления вращения, его конструкция и схема работы основаны на принципе оптической модуляции света через диск.

Устройство датчика:

  • Внутри установлен светодиод (ИК-излучатель), который подсвечивает импульсный диск;

  • С противоположной стороны находятся два фотоприемника (фототранзистора);

  • Эти два фотоприемника расположены со смещением относительно друг друга (90° фазовый сдвиг).

 HOA0902-11

HOA0902-11

В данной статье будут рассмотрены

  • Физические принципы работы HOA092-11;

  • Схема подключения к микроконтроллеру STM32F030CCTx;

  • Программная реализация (расчет пройденного пути, скорости и направления движения, а также вывод информации на дисплей).

Технические характеристики HOA092-11

Ссылка на техническую документацию HOA0902-11 [https://static.chipdip.ru/lib/059/DOC000059035.pdf]

  • Напряжение питания [ 4.5 - 5.5В ];

  • Тип выхода [ NPN открытый коллектор ];

  • Слот (зазор) [ 3.2 мм ];

  • Минимальный механический период (разрешение) [ предназначен для работы с механическим периодом равным 0,036 in (≈ 0.914 мм), что дает разрешение до 0,018 in (≈ 0,457 мм) ];

  • Температурный диапазон эксплуатации [ от -40°C до +70°C ]|.

Применение

  • Высокоточные оптические энкодеры;

  • Системы позиционирования в робототехнике;

  • Прецизионные системы контроля скорости вращения;

  • Линейные и ротационные измерительные системы.

Принцип работы HOA0902

  1. Инфракрасный излучатель (IRED) генерирует постоянный поток ИК-излучения;

  2. Кремниевый NPN фототранзистор выполняет функцию приемника излучения;

  3. Оптический зазор между излучателем и приемником обеспечивает зону детектирования.

Режимы работы:

  • Выход(SPEED(TACH)) - генерирует импульс при каждом пересечении порога освещенности, т.е. как только импульсный диск будет проходить через щель, появляется импульс (ширина 8 микросекунд, частота 125 kHz), как раз этот импульс я и буду обрабатывать в микроконтроллере.

В данном проекте используется импульсный диск он состоит из 16 "окон", за одно прохождение "окна", датчик будет выдавать контроллеру по 2 импульса,

Конструкция датчика и расположение "окон" на диске сделаны так, что когда одно "окно" проходит над датчиком, два приемника оказываются в разных фазах этого "окна".

Один приемник (канал A) находится точно по центру окна, когда другой (канал B) находится уже на краю (или наоборот).

Это приводит к тому, что сигналы с каналов A и B сдвинуты относительно друг друга на 90 электрических градусов.

Зачем это нужно?

Такой сдвиг (квадратура) решает сразу несколько критически важных задач:

1. Определение направления вращения (главная причина)
Это самая важная функция, схема обработки сигнала в датчике смотрит, какой канал опережает.

  • Если канал A опережает канал B → вращение по часовой стрелке.

  • Если канал B опережает канал A → вращение против часовой стрелки.

2. Повышение разрешения

Удвоение количества импульсов достигается за счет обработки двух сдвинутых по фазе сигналов, что позволяет извлекать из одной механической конструкции вдвое больше полезной информации, в данной статье датчик HOA0902-11, через который проходит импульсный диск имеющий 16 "окон" при полном обороте, будет выдавать 32 импульса, таким образом получается более точное измерение угла, расстояния и скорости, что позволяет разрешению увеличиваться.

  • 16 импульсов - шаг угла 360° / 16 = 22.5°;

  • 32 импульса - шаг угла 360° / 32 = 11.25°.

3. Повышение помехоустойчивости и надежности Система может проверять соответствие сигналов двух каналов друг другу. Если возникает одиночный ложный импульс на одном канале, которому нет соответствия на другом, его можно отфильтровать как ошибку.

  • Выход направления (DIRECTION) - это логический вывод, который формируется внутри датчика HOA0902-11 из сравнения сигналов А и В, т.е. датчик сам определяет направление вращения и выдает это как отдельный цифровой сигнал:

    DIRECTION = 0 (LOW) - вращение вперед (например, по часовой стрелке);

    DIRECTION = 1 (HIGHT) - вращение назад (против часовой стрелки).

Таким образом, не нужно в МК сравнивать А и В, чтобы вычислять направление - датчик сам это делает, достаточно просто повесить прерывание.

!!! Очень важная информация, так как датчик HOA0902-11 работает по +5В, подключать напрямую сигналы "SPEED(TACH)" и "DIRECTION(DIR)" к микроконтроллеру STM32 (у которого логика работы по +3В) опасно, есть риск повреждения выводов, в следствии МК может просто выйти из строя.

 Осциллограмма сигнала SPEED(TACH) (до делителя)

Осциллограмма сигнала SPEED(TACH) (до делителя)

 Осциллограмма сигнала DIRECTION(DIR) (до делителя)

Осциллограмма сигнала DIRECTION(DIR) (до делителя)

Для того чтобы напряжение было приемлемым, для МК, необходимо поставить делители напряжения, на сигналы "SPEED" и "DIRECTION".

 Осциллограмма сигнала SPEED(TACH) (после делителя)

Осциллограмма сигнала SPEED(TACH) (после делителя)

 Осциллограмма сигнала DIRECTION(DIR) (после делителя)Схема подключения HOA0902-11 и дисплея к микроконтроллеру STM32F030CCTx

Осциллограмма сигнала DIRECTION(DIR) (после делителя)Схема подключения HOA0902-11 и дисплея к микроконтроллеру STM32F030CCTx

На данной схеме изображено подключение датчика HOA0902-11 и дисплея, к микроконтроллеру STM32F030CCTx, а также реализация преобразователя со стабилизатором напряжения

 Схема подключения HOA0902-11 и дисплея к микроконтроллеру STM32F030CCTx

Схема подключения HOA0902-11 и дисплея к микроконтроллеру STM32F030CCTx

Перечень элементов

Пояснения к схеме

Выводы NRST и BOOT0

Вывод NRST(reset) используется для аппаратного сброса МК, подключается через резистор R7(10кОм) к питанию +3В - подтягивает NRST к логической "1", конденсатор С5(0,1мкФ), формирует RC-цепочку, используется для подавления помех и автосброса при включении питания, данный пример схемы гарантирует корректный старт МК после подачи питания, защищает от ложных срабатываний при скачках напряжения.

 Подключение NRST и BOOT0

Подключение NRST и BOOT0

Вывод BOOT0 определяет, откуда МК будет загружать программу после сброса:

  • BOOT0 = 0 - загрузка из Flash-памяти(основной режим работы);

  • BOOT0 = 1 - загрузка из системной памяти (встроенный загрузчик через UART, I2C, SPI).

В схеме вывод подтянут резистором R8 к земле (логический "0"), это обеспечивает автоматическую загрузку программы из flash-памяти после старта, если потребуется использовать встроенный загрузчик, можно временно подать "1" на BOOT0.

Обвязка питания VCC и VA

МК имеет несколько выводов питания:

  • VCC - основное цифровое питание (3.3В);

  • VA - питание аналоговой части (АЦП, компараторы и т.д.).

На выводах VCC и VA уставлен конденсатор С6 (0.1мкФ), он фильтрует высокочастотные помехи, возникающие при переключении логики, конденсатор ставиться как можно ближе к выводам МК, также дополнительно установлен танталовый конденсатор 4.7мкФ, он сглаживает низкочастотные колебания и стабилизирует питание аналоговой части.

Микросхема DA1 - MP2315 представляет собой синхронный понижающий (buck) DC-DC преобразователь с интегрированными силовыми MOSFET-ключами. Высокая частота переключения (до 2.2 МГц), компактный корпус и широкий диапазон входных напряжений (от 4.5 В до 24 В), ссылка на техническую документацию MP2315 [https://www.alldatasheet.com/datasheet-pdf/pdf/1035056/MPS/MP2315.html].

Микросхема DA2 - LP2985 представляет собой малошумящий стабилизатор, предназначен для преобразования входного напряжения +5В в стабильное напряжение +3В, используемое МК и периферийными узлами, ссылка на техническую документацию LP2985 [https://www.alldatasheet.com/datasheet-pdf/pdf/99706/TI/LP2985.html].

Подключение датчика HOA0902-11

  • Сигнал SPEED(TACH) - подключается через делитель R1 и R3, к выводу МК-12(PA2);

  • Сигнал DIR(DIRECTION) - подключается через делитель R4 и R5, к выводу МК-13(PA3).

Подключение дисплея

  • Сигнал SDA - подключается к выводу 21(PB10);

  • Сигнал SCL - подключается к выводу 22(PB11).

Настройка микроконтроллера STM32F030CCTx в CubeIDE

Настройка выводов

Вывод PA2 настроен на внешнее прерывание (EXTI) (выполняет роль триггера для подсчета импульса) к нему подключается сигнал SPEED(TACH) датчика HOA0902-11, каждый раз, когда через окно датчика проходит импульсный диск, датчик формирует импульс, далее он фиксируется аппаратным модулем EXTI, который:

  • Генерирует прерывание;

  • Устанавливает флаг encoderDone;

  • Делегирует дальнейшую обработку в функцию encoder_Handler().

Вывод PA3(DIRECTION) (GPIO_INPUT), используется для определения направления вращения.

Настройка таймеров

TIM3 используется как счетчик временных интервалов, настроен на генерацию прерываний, каждое срабатывание таймера фиксирует количество импульсов, поступивших от энкодера, таймер настраивается на прерывание раз в 100ms.

 Настройка TIM3 в CubeMX

Настройка TIM3 в CubeMX

TIM14 используется в качестве системного диспетчера вывода информации на дисплей, таймер настраивается на генерацию прерываний с периодом 200mS, при каждом срабатывании прерывания происходит вызов функции display_update(), которая обновляет содержимое экрана.

 Настройка TIM14

Настройка TIM14

Настройка приоритетов

  • EXTI line 2 and 3 interrupts - [0];

  • TIM13 - [1];

  • TIM14 - [2].

Настройка Clock

Реализация программного кода

Ссылка на скачивание исходного кода [ https://t.me/ChipCraft В закрепленном сообщении [ #исскуствомк_исходный_код - Исходный код для Encoder_HOA0902-11_STM32F030CCT6], а также видео тестирования энкодера [#исскуствомк_тестирование_Encoder].

Библиотеку для работы с дисплеем я взял с [https://github.com/afiskon/stm32-ssd1306/tree/master]

Функция display_init()

Выполняет начальную инициализацию дисплея, подключенного по интерфейсу I2C(на базе контроллера SSD1306)

  • Инициализируется драйвер дисплея;

  • Выполняется заливка экрана черным цветом;

  • На дисплее на 2 секунды отображается стартовый экран с надписью ''ChipCraft";

  • После задержки экран очищается для дальнейшей работы.

Функция encoder_Handler() обработчик инкрементального энкодера

  • Вызывается при установке флага encoderDone, который формируется в прерывании внешнего входа (EXTI);

  • Определяется направление вращения вала датчика по состоянию пина DIRECTION_Pin:

    • RESET - движение вперед (инкремент счетчика);

    • SET - движение назад (декремент счетчика).

  • Вызывается метод get_distance_m() для расчета дистанции.

Функция display_update()

Отвечает за визуализацию информации на дисплее:

  • Экран предварительно очищается с помощью ssd1306_Fill(Black);

  • В верхней части по центру отображается надпись "Encoder";

  • Ниже последовательно выводятся:

    • количество импульсов;

    • дистанция;

    • скорость.

  • Буфер графики передается на дисплей вызовом ssd1306_UpdateScreen()

Функция float get_distance_m()

Возвращает текущее значение пройденного пути в метрах, расчет выполняется как произведение общего числа импульсов pulse_counter на метрический коэффициент DIST_PER_STEP_M, который определяется из геометрии колеса и количества "окон" импульсного диска.

Формула расчета дистанции

где:

  • N - Число импульсов;

  • D - Диаметр колеса;

  • PPR - количество импульсов на оборот.

HAL_TIM_PeriodElapsedCallback Функция обратного вызова, выполняется при переполнении таймера

  • Каждые WINDOW_TIME_S секунд фиксируется количество импульсов в pulse_counter_window;

  • После чтения счетчик сбрасывается;

  • Рассчитывается скорость

    Формула расчета скорости

окно - это фиксированный промежуток времени, в течении которого производится расчет количества импульсов от датчика, в данном проекте будет 100 мс (0.1 с)

  • Скорость определяется как отношение пройденного пути за окно.

где S - путь в окне, t - длительность окна.

также в данной функции вызывается display_update(), для визуализации текущих значений на дисплее.

Модуль process_Encoder

Модуль proj_main()

  • Выполняется инициализация дисплея;

  • Запуск таймеров;

  • Запуск функции encoder_Handler().

Вывод

В результате проделанной работы реализована полноценная система измерения и отображения параметров энкодера, на базе датчика HOA0902-11 и микроконтроллера STM32F030CCTx.

Тест энкодера

Перейти к видео

Если статья показалась Вам интересной, буду рад выпустить для Вас еще множество статей исследований по всевозможным видам устройств, так что, если не хотите их пропустить – буду благодарен за подписку на мой ТГ-канал: https://t.me/ChipCraft.

Показать полностью 23 1
[моё] Инженер Программа Энкодер Stm32 Электроника Гифка Видео Вертикальное видео Короткие видео Длиннопост
0
3
v.azhure
v.azhure
Серия Самоделки для гонок

Демонстрация самодельного линейного актуатора подвижной платформы⁠⁠

5 месяцев назад

Записал видео работы линейного актуатора распечатанного на 3д принтере.

Ход актуатора 85 мм. Скорость до 150 мм/сек.

На мой взгляд, получилось очень даже неплохо и сильно дешевле аналогов.

Ссылки для скачивания:

ПО: https://github.com/vazhure/vAzhureRacingHub

Arduino Sketch: https://github.com/vazhure/vAzhureRacingHub/tree/main/Motion...

3Д модель для печати актуатора: https://www.printables.com/model/961759-linear-actuator-for-...

Это некоммерческий проект для любителей автосимуляторов.

✌

Показать полностью 1
[моё] Своими руками 3D печать Видеоигра Симрейсинг Симулятор Видео RUTUBE YouTube Stm32 Ссылка Длиннопост
3
16
v.azhure
v.azhure

Замерил сколько потребляет моя самодельная подвижная платформа⁠⁠

6 месяцев назад

Решил замерить потребление моей самодельной подвижной платформы на шаговых серво-двигателях.

Оказалось всё довольно экономно при цене в 5.56 руб за киловатт-час. Выходит около 56 коп. в час. При стоимости ваттметра в 831 руб. за те же деньги можно играть более 1400 часов.

Мой софт: https://github.com/vazhure/vAzhureRacingHub

В последней прошивке добавил возможность работы с SimHub Motion (30$ лицензия). Мой софт абсолютно бесплатен, но меньше настроек...

Скетч для Arduino IDE: https://github.com/vazhure/vAzhureRacingHub/tree/main/Motion...

Замерил сколько потребляет моя самодельная подвижная платформа

Положение кресла (Seat offset) пока не учитывается в расчётах.

Модель для 3д печати линейного актуатора: https://www.printables.com/model/961759-linear-actuator-for-...

✌

Показать полностью 1 1
[моё] Своими руками Симулятор Arduino Stm32 Программное обеспечение Тест Видеоигра 2dof 3D печать Видео RUTUBE YouTube Длиннопост
2
dxxp
dxxp

Какие номиналы резисторов самые ходовые? Резистор металлаплёночный 1% 0.25Вт 1/4W⁠⁠

6 месяцев назад

Пополняю ассортимент своего магазина. Хотел спросить у более сведущих в этой сфере людей. Какое сопротивление резисторов самое ходовое? Как лучше закупить и каких побольше?

Техника Электроника Электрика Технари Радиокомпоненты Компоненты Радиотехника Самоделки Arduino Stm32 Arduino Nano V3 Радиодетали Резистор Транзистор Сопротивление Физика Запчасти Радио Светодиоды Диоды Текст
13
7
stm32zagotovka
Лига программистов

Обновление "HTTPS" для проекта "Zagotovka_M"⁠⁠

7 месяцев назад

Пишу этот пост для двух своих подписчиков. Спасибо, что подписались после моего поста про “Заготовку-М” — видимо, Вам интересна эта тема или STM32 в целом. Ссылка на прошлый пост "Zagotovka - M" Отписывайтесь от меня это мой последний пост здесь, так как большинству тема не зашла! Буду искать другие площадки. Спасибо за поддержку — почувствовал себя, блогером с золотыми кнопками от ‘YouTube’ благодаря вам у меня аж две такие золотые кнопки :)

А теперь вернемся к “Заготовка-М” вышло обновление, которое предоставит удаленно управлять Вашей автоматизацией. Теперь Вы легко настроите “HTTPS-сервер” без сложных манипуляций с ‘OpenVPN’ или аренды серверов для зашифрованных туннелей. Данное обновление предоставляет Вам управлять вашей автоматизацией из любой точки мира без сложных посредников!

“HTTPS-сервер” использует RAM, но все еще оставляет достаточно памяти для реализации ваших личных хотелок!

Ниже видео инструкция как настроить и пользоваться "HTTPS сервером".

Ссылка на youtube:

Ссылка на rutube:

Показать полностью 1
[моё] Stm32 Smart Автоматизация Умный дом Программирование Электрик Home Assistant Majordomo Умная техника Microcontrollers IT Программист Программа Разработка
12
10
sparsw

Yet Another: Реализация R2R-ЦАПа на 0805-smd резисторах и STM32F103C6T6⁠⁠

8 месяцев назад

Недавно узнал о простейшей схеме с названием R2R-ЦАП, а поскольку являюсь совсем уж начинающим радиолюбителем, то решил ее реализовать. С одной стороны это вполне себе цифровая схема, а с другой стороны на выходе получается аналоговый сигнал. Вполне себе учебная "задачка" из разряда "помигать светодиодом". Ну а в заметке опишу, что же в итоге удалось получить - вдруг опытные и знающие люди подскажут и помогут теми или иными ценными советами :), которые будут также полезны и всем другим начинающим радиолюбителям.

Для начала на макетной платке припаял резисторы. В качестве номинала взял 100 Ом и 200 Ом. Почему такие номиналы? Ну какие-то надо было взять. Так что выбор номиналов был по сути случайный. Изначально сделал в ЦАПе 12 бит, но в последствии использовал из них только 10 бит. Дело в том, что smd-резисторы с типоразмером 0805 брал самые простые. Точность номинала на них указана в 5%, что изначально должно ограничить характеристики схемы. Поэтому сразу возникла идея провести для получившейся схемы минимальную калибровку, поскольку правильные значения на выходе R2R-ЦАПе получаются только при "идеальном" значении резисторов. На плате STM32F103C6T6 в наличии имеется 12-битный АЦП, при этом пишут, что такой ЦАП имеет внутренние шумы, а значит делать калибровку для ЦАПа, работающего в режиме 12-бит, вряд ли имело смысл. Вот и ограничился в итоге для ЦАПа 10-битами.

Тот самый R2R-ЦАП на 12 бит

Тот самый R2R-ЦАП на 12 бит

Итак, самый первый сигнал который стал формироваться с помощью получившегося ЦАПа - это пила, то есть повторяющиеся кусочки простой линейной функции.

простой линейный сигнал

простой линейный сигнал

Здесь сделаю небольшое отступление про осциллограф. Чтобы в целом придерживаться формата "Опыт начинающего радиолюбителя". Когда выбирал свой первый и на данный момент единственный осциллограф, то самым главным критерием для меня была ... Угадали? Да, конечно это была цена. В ситуации, когда не было никакого опыта выбора осциллографов, брал самый дешевый. И это оказался Fnirsi 1014D, который обошелся мне в 11'625 рублей. Возможно "цифровой" Hantek обошелся бы дешевле, причем с лучшими характеристиками, но хотелось получить осциллограф именно с экранчиком, все как у настоящих осциллографов, чтобы все было по "взрослому". Покупал естественно на aliexpress. И еще наверное меня очень сильно подкупило, что доставка была всего 5 дней, видимо сразу со склада в России. Иногда, особенно по началу так тягостно ждать очередной посылки с aliexpress. И как это обычно бывает самые "полезные" обзоры, в которых был полный разгром данной модели, попались уже после покупки. Но лично мне данный осциллограф тем не менее помог очень сильно и не раз. Например, без него в принципе не смог бы разобрать свои ошибки в программировании SPI-обмена с платой WizNet 5500. Ну и еще такой момент. Когда в старших классах был физический практикум (привет "Трем Кубикам" :)), то пару занятий были посвящены работе с осциллографами. А это были еще старые советские осциллографы, с люминофорными экранами. Это было волшебно! Щелкать тумблерами, ждать пока осциллограф немного прогреется. Но занятий было всего пару штук. И наиграться тогда вдоволь не получилось. Но это удалось сделать с Fnirsi :). Закрыть так сказать гельштат.

Напишу также пару слов и про плату WizNet 5500 и плату STM32F103C6T6 со всеми ее "коварствами" после STM32F103C8T6. Плата WizNet 5500 позволяет, где-то за 300-350 рублей (последние цены не смотрел) снабдить bluepill-плату ethernet-интерфейсом, при этом сразу с UDP и TCP соединениями на уровне wiznet-библиотеки для микроконтроллера, реализованными в wiznet-чипе аппаратно. Мне разобраться в примерах было не просто, но так или иначе установить tcp-соединение с компьютером в итоге получилось. Естественно изначально хочется зарезервировать скорость обмена по-больше, про запас, а то вдруг потом не хватит! Поэтому настроил SPI на stm'ке на 36 МГц. Но реализовав обмен по tcp-сокетам заметил, что часть пакетов иногда теряется. И этого в tcp!!! Без разрыва сокетного-соединения!!! Да как такое вообще возможно!!! Но тут скорее все дело в том, что максимальная заявленная скорость для Wiznet 5500 по SPI - это 33 МГц (как обычно совершенно случайно где-то на просторах интернета встретил такие строки). Снижать скорость на SPI до 18 МГц еще не пробовал. Но с микроконтроллерами постоянно какие-то "обломы". Вот только что все работало. Добавил пару строк в прошивку - и вот уже не работает ничего, а самое главное не получается вернуться на работающие состояние :(((. Но зато как приятно и спокойно становиться, когда разбираешься в причинах очередного "косяка".

Теперь, чем же надо мной так "подшутила" плата STM32F103C6T6. И дело тут, не подумайте плохого, вовсе не в жадности, а дело тут в самой что ни на есть, мать ее, экономии, потому что "гадость", но зато на свои. Платы STM32F103C8T6 продаются за 130-150 рублей. (Возможно это все нелицензионные копии, но мне на неработающие платы попадать не приходилось, тут стараюсь смотреть на рейтинг магазина.) Немного добавишь, и уже blackpill на 84 МГц заместо 72МГц от 180 рублей можно найти. А вот STM32F103C6T6 находятся за 90-100 рублей (и это если не сильно долго искать). В общем жаба начинает душить во всю мочь. Ну подумаешь там 10Kb и 32Kb флеш-памяти заместо 20Kb и 64Kb. Мне вполне вроде бы этого хватает. Короче так я подумал, заказал и забыл. Совсем забыл, что заказал STM32F103C6T6. А когда стал заливать прошивку - бац, и ничего не работает. Диодики не мигают. Что делать? Неужели платка превратилась в кирпич. А за ней еще одна. А за ней еще одна. Ужас охватил меня... Так что пришлось тут научиться подключать отладчик gdb с помощью st-util (спасибо, добрым товарищам написавшим посты про это на форумах). И затем вслед за микроконтроллером впадать в ступор, когда самая обычная, самая первая операция ST выводит микроконтроллер в астрал. И только потом обратить внимание на эти самые 10Kb, которые как в ничем не бывало оказывается печатает программа прошивки в консоль, и что надо править ld-скрипт для изменения установки начального адреса стека. А еще таймеров там меньше, и SPI'ев меньше, а самое неожиданное - там еще и GPIO-портов меньше доступно, что уже совсем подло, с учетом того, что внешне платы ну ничем не отличаются. Но пенять тут надо конечно только на себя самого.

00111111b -> 01000000b

Вот в такие моменты результирующие значения напряжения и могут "проседать". Но то что без использования (безумно дорогих) прецензионных резисторов в ЦАПе будут искаженные выходные значения вполне допускалось. При измерении итоговых значений на выходе ЦАПа для каждого 10-битного значения делалось усреднение по 32 измерениями. При повторном проходе все средние значения в целом подтвердились, однако чувствительная дисперсия все-таки наблюдается. Но тут и собрано все на коленках, и проводки не экранированы (подсмотрел такое оправдание в интернете), и шумы в АЦП есть, так что танцоры если что мы хорошие, а это все они - те самые шумы. Еще тут конечно можно задаться вопросом, а насколько постоянный уровень напряжения на ножках микроконтроллера (использование powerbank'а в качестве источника напряжения видимого эффекта не дало). Но для проверки нужна видимо аппаратура совсем другого класса и стоимости. А откуда все это у простого начинающего радиолюбителя? Тем не менее приведу график построенный из измеренных значений:

График измерений реальных значений ЦАПа

График измерений реальных значений ЦАПа

Как видно значения ЦАПа вместо линейной функции выдают почти "линейную" функцию со скачками. Но раз таблица получена, то можно для каждого значения, которое нужно получить на выходе из ЦАПа найти такую комбинацию из 10 битов, которые дадут наиболее близкое значение к требуемому. И тогда простой сортировкой для конкретной платы ЦАПа получается таблица обратного поиска, по которой для требуемого значения находится оптимальная комбинация битов. И вуаля, у нас получается второй график, на котором все возможные значения на выходе из ЦАПа, уже выстроены в монотонную функцию:

Линейная функция и ее аппроксимация табличными значениями

Линейная функция и ее аппроксимация табличными значениями

К последнему графику надо дать следующие пояснения. Зеленым цветом приведен график просто линейной функции. А "фиолетовым" цветом изображен график функции, составленной из наиболее оптимальных возможных табличных значений, полученных с помощью калибровки. При этом значения из таблицы подбираются так, чтобы получить как можно более близкие значения к линейной функции. Приведу следующий график, на котором просто увеличен масштаб:

Линейная функция и ее аппроксимация табличными значениями (увеличен масштаб)

Линейная функция и ее аппроксимация табличными значениями (увеличен масштаб)

Здесь уже лучше заметны фиолетовые горизонтальные полоски. Полоски появляются там, где плотность табличных значений меньше и приходится одно и тоже табличное значение использовать несколько раз подряд. Но в целом плотность значений получается на качественном уровне достаточно хорошая. И теперь вооружившись калибровочной таблицей сформируем на ЦАПе снова всю ту же линейную функцию, только вместо увеличения на единицу на каждом шаге битового значения из 10-битов, будем использовать битовый код подобранный с помощью таблицы:

Перейти к видео

На последнем графике выводятся сразу два линейных сигнала по очереди. В одном используются подобранные битовые коды, а во втором - как и ранее прямая "наивная" последовательность битовых кодов. Там где прямая "наивная" последовательность - там есть скачки. Там где последовательность подобранных битовых кодов - сигнал получается "монотонным". Ну а дрожание сигнала время от времени спишем на неэкранированные проводки. Снова вооружившись таблицей, теперь попробуем сделать синусоиду. На один период синусоиды возьмем 32 значения, так что 33 значение начнет уже следующий период, поэтому совпадет с начальным значением. Значения, благодаря, калибровочной таблице должны быть монотонны (на участках монотонности синусоиды). Правда как оказалось просто дискретные скачки будут по-страшнее всякой небольшой не монотонности. Так что в итоге получим примерно следующую картинку:

Синусоида из 32 значений не период

Синусоида из 32 значений не период

В целом удалось получить гармонический сигнал с частотой в 204 КГц, ну или почти гармонический сигнал :). Как писать оптимальные циклы для микроконтроллера не знаю, я сделал (на Си) простой бесконечный цикл из LD, ST, ADD и AND, где операция AND обрезает индекс после инкремента и тем самым зацикливает чтение. С этой точки зрения цикл для сигнала с длиной равной степени двойки будет наиболее быстрым. А потому будет давать более высокую частоту сигнала. По моим прикидкам длительность одной итерации цикла составляет 6МГц, то есть с такой частотой можно менять значения сигнала, длина которого есть степень двойки (32*204КГц = 6.528МГц).

Теперь попробуем увеличить частоту гармонического сигнала, для чего возьмем всего 6 точек на один период синусоиды и не будем при этом слишком строги к результату :)

Синусоида из 6 точек на период

Синусоида из 6 точек на период

Да, это тоже синусоида. Ну и что не синусоидная. Зато частота в 857КГц. И потом все очень сильно зависит от масштаба и точки взгляда :). Возьмем, например, предыдущую синусоиду и сделаем из нее конфетку простым изменением масштаба по времени и амплитуде. При подходящем масштабе для 32-точечной синусоиды все ОЧЕНЬ ГЛАДКИМ становится и "шершавости" совсем незаметны:

Перейти к видео

Быстро сказка сказывается, да не скоро дело делается. А как же фильтры нижних частот спросите Вы. А как же, слыхали и про них, слыхали. И даже такое страшное название как ФНЧ-Баттервота 7-ого порядка встречать доводилось. В интернете и не такое можно встретить. Благо найти и онлайн ФНЧ-калькулятор не сложно. Но есть две загвоздки. Опять не очень понятно как правильно выбирать сопротивление (согласование каскадов, входное и выходное сопротивление, импеданс - все это пока страшные заклинания). А вторая загвоздка более серьезная - в наличии у меня были индуктивности только на десятки и сотни нГн, а вот на десятки и единицы мкГн - увы, не ма. И приедут они только через несколько недель. А именно такие значения индуктивностей выдает онлайн калькулятор для частоты среза в 2-3 МГц. Единственное, что оставалось так это допаять RC-фильтр (первого порядка?). Снова берем значение резистора наобум и выбираем 560 Ом. Подбираем значение конденсатора в 180пФ, чтобы частота среза была примерно 1.6МГц.

R2R-ЦАП после добавления RC-фильтра (то есть резистора и конденсатора)

R2R-ЦАП после добавления RC-фильтра (то есть резистора и конденсатора)

И в принципе для 32-точечной синусоиды даже RC-фильтр заметно помогает. Она действительно становится практически гладкой, ну насколько об этом можно судить из осциллографа:

Животворящий ФНЧ для 32-точечной синусоиды, пусть он всего лишь и RC

Животворящий ФНЧ для 32-точечной синусоиды, пусть он всего лишь и RC

Кое-что RC-фильтр делает и для 6-точечной синусоиды, хотя уже и не так много:

RC-фильтр пытается помочь 6-точечной синусоиде стать более гармоничной

RC-фильтр пытается помочь 6-точечной синусоиде стать более гармоничной

К сожалению попробовать что-нибудь по-солиднее, чем RC-фильтр пока нет возможности. Поэтому вопрос, а можно ли получить приличную синусоиду на 1МГц с помощью STM32F103C6T6 (работающей на частоте 72МГц) и R2R-ЦАПа лично для меня пока остается открытым.

Итого подведем небольшой итог. Стоимость STM32F103C6T6 составляет порядка 100 рублей. Кусочек текстолита с набором SMD-компонент в лице резисторов, конденсаторов и индуктивностей (для Баттерворта 7-ого порядка) оценим также в 100 рублей. Соответственно получаем ЦАП за 200 рублей для сигнала с частотой на 200КГц, возможно с достаточно произвольной формой по частоте и амплитуде. А вот можно ли выправить фильтрами синусоиду с частотой в 1 МГц из 6 точек на период пока не понятно.

Есть конечно AD9834, который выдает синусоиду аж на целых 37.5МГц, но стоимость готовой платки, если не ошибаюсь, начинается уже от 1800 рублей. Сам чип возможно получиться и за 700-800 рублей найти (а то и 500 рублей), но тогда надо самому делать плату. А сны про черную и белую магию уровня "развести плату" пока только сами снятся в других снах :). Да и 37.5МГц тоже как бы не предел мечтаний. Но самое главное, что хотя на плате два выхода, на самом деле это один сигнал. Дифференциальный это сигнал или нет, да и что такое это самое дифференциальный сигнал и как с ним работать для меня сплошная тайна.

Есть AD9851, у которого вроде бы две синусоиды и максимальная частота уже 70МГц. Это уже почти хорошо, но это надо проверять. Можно ли эти синусоиды синхронно сдвинуть ровно на четверть периода и действительно ли их две независимых. Цена у AD9851 при этом уже более комфортная. Тем не менее пишут, что шумов много, а реальная максимальная частота скорее 50МГц - 60МГц. Малова-то.

Есть еще конечно и AD9959 с ценой готовой платы от 6000 рублей. Там сразу 4 выхода и частота синусоиды уже вроде как 200МГц, а это уже предел (текущих) мечтаний. Но 6000 это 6000. Кроме того, странно что выхода на плате 4, а вот сигналы у самого чипа вроде как тоже сдвоенные (дифференциальные?), а значит выходов должно быть 8. Не понятно. В общем цена у AD9959 пока совсем не "симпатичная".

С другой стороны продаются платы с ADF4351, который уже не DDS, а именно, что генератор частоты, если конечно правильно все понял. Там цена готовой платы уже где-то в районе 1700 рублей (видимо недавно цена на них снизилась, может быть много их наклепали). И частоты от 35МГц до каких-то сказочных и фантастически-невозможных 4.4ГГц, и вроде бы два выходных сигнала. Но опять это похоже сдвоенные выходы одного сигнала. Есть у ADF4351 и вход для внешней clock-частоты. Но что это за частота, какая форма сигнала допустима и как она влияет на выходной сигнал. Что-то вроде бы написано про задержку фазы, и если задержку фазу действительно можно настраивать, то на первый взгляд из двух ADF4351 при общем источнике внешней частоты можно собрать две синхронных синусоиды. Да еще с практически с любой частотой, хоть 1ГГц. Но так ли это на самом деле.

Если все-таки немного еще пофантазировать и помечтать, то для повышения частоты R2R-ЦАПа напрашивается использование ПЛИС. И есть даже OMDAZZ с его частой в 50МГц. Лежит, пылится, все по принципу как знал, как знал, что "пригодится". Наверное, можно с OMDAZZ вытянуть частоту синусоиды до ~10МГц, если выход действительно можно сгладить фильтрами. Осталось только чуть-чуть освоить verilog и сделать первую самую простенькую прошивку - делов-то (впрочем, если серьезно, то осваивать verilog по принципу google/yandex-поиск и копи-паст все равно наверное придется). Если гипотетически рассмотреть условно восемь параллельных выходов, которые соединяются электронными ключами, то тем самым получается буферизация для выходного сигнала. А переключение идет с помощью счетчика, тактируемого с частотой умноженной в 8 раза по сравнению с частотой ПЛИС, при этом все 8 выходов устанавливаются за один такт ПЛИС. Вот только логических элементов с частотой переключения ~500МГц как-то не наблюдается на горизонте. Пара ADF4351 выглядит перспективней по частотам, но поди их собери вместе. И тогда видимо альтернативы для платы с AD9959 и ее ценой в 6000 рублей для получения двух синхронных синусоид с частотой 100МГц, сдвинутых относительно друг друга на четверть периода, похоже не особо просматривается.

UPD:

пропущенный абзац перед
00111111b -> 01000000b

Однако вернемся к R2R-ЦАПу и линейному сигналу. Как видно просто из картинки в сигнале есть скачки. Самый сильный скачок так раз по середине сигнала. В принципе как потом стало ясно из калибровки, то есть оцифровки сигнала через ЦАП все той же STM-платы, что точки скачков кратны степеням двойки. И можно предположить, что связаны они с переходом от предыдущих значений к следующим значениям, большим на единичку, когда значительное количество младших битов заменяется на один старший бит:

UPD2:
Как оказалось тема калибровки на просторах интернета все-таки поднималась. Например, вот здесь: https://www.eevblog.com/forum/projects/r-2r-ladder-dac-calib...
Там кстати есть точно такая картинка с экрана осциллографа для линейной функции. И там ровно все те же скачки в точках, кратным степеням двойки. Похоже гуглить надо так:
"r2r dac calibration"

Показать полностью 11 2
Микроконтроллеры Stm32 Самоделки Обучение Видео Короткие видео Длиннопост
7
3
levtsn
levtsn

Троичный цап заработал от компа⁠⁠

9 месяцев назад
[моё] Схемотехника Своими руками Stm32 Видео RUTUBE Короткие видео
0
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии