STM32F030F4 задержки

Функция delay() при помощи таймера TIM16

Сперва инициализация

void TIM16_init(void){
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_TimeBaseInitTypeDef TIM_InitStructure; 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM16, ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = TIM16_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
  
  TIM_InitStructure.TIM_Period = 1;
  TIM_InitStructure.TIM_Prescaler = 400;
  TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_InitStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM16, &TIM_InitStructure);

  TIM_ITConfig(TIM16, TIM_IT_Update, ENABLE);
  TIM_Cmd(TIM16, ENABLE);
}


400 реально мэджик нумбер подобраный осцилографом. )) Как оно рассчитывается в теории понятно, но на практике что-то не очень. Вообщем это дает нам прерывание таймера каждые 100 микросекунд.


static volatile uint16_t delay_counter = 0;
void TIM16_IRQHandler(void) {
    if (TIM_GetITStatus(TIM16, TIM_IT_Update) != RESET) {
        delay_counter++;
        TIM_ClearITPendingBit(TIM16, TIM_IT_Update);
    }
}


И собственно функции задержки:

void delay_100us(void) {    // задержка 100 uS
  delay_counter = 0;
  while (!delay_counter);
}

void delay_ms(int ms) {    // задержка N mS
  int i;
  for(i=0;i<ms*10;i++) {
    delay_100us();
  }
}


Код мне кажется не очень оптимальным, — вот как чувствую грабли, — послушал бы ваши замечания.

Использвание (мигание светодиодом):

  while(1)
  {
     GPIO_SetBits(GPIOA, GPIO_Pin_4);
     delay_ms(500);
     GPIO_ResetBits(GPIOA, GPIO_Pin_4);
     delay_ms(500);
  }

Генерация синуса 50 Гц на AVR

КдПВ
Я недавно в форуме чисто теоретически поднимал вопрос о бесперебойнике с чистым синусом.

А тут еще стабилизатор сгорел, от которого котел газовый запитан был, да с такими спецэффектами сгорел, что до сих пор запах горелой изоляции в кухне. Слава Богу, УЗО отработало, проводка выдержала, в общем, обошлось.

Так что теория постепенно начала превращаться в практику, но пока (на уровне идеи) с использованием железного трансформатора от сгоревшего UPS, коих у меня накопилось уже много.

UPD: Добавил пару картинок


Читать дальше

Формирование импульсов для IR-управления на аппаратном таймере-2 ATmega8

В этой статье приводится описание алгоритма формирования импульсов для IR-управления на аппаратном таймере-2 на примере ATmega8. К статье прилагается программа расчета констант и формирования фрагментов кода для AVR-С.

В процессе разработки поворотного стола для круговой фотосъемки возникла задача дистанционного управления фотокамерой. В поисках информации была найдена статья, автору которой я очень признателен за подробный разбор. Но у него стояла задача выдачи одной лишь команды на один тип камеры (ее выбор осуществляется на этапе компиляции), а мой девайс помимо этого занят другими важными делами, да и не люблю я транжирить память программ списком макросов Pulse/Pause. И к какой конфессии (Canon'истам или Nikon'истам) относится конечный пользователь — неизвестно. В результате было принято решение из статьи взять цифры, а остальное реализовать по-своему. Для этой задачи, как мне кажется, как нельзя лучше подходит аппаратный таймер-2. Потому что у нулевого нет прерывания по совпадению и, тем более, возможности «дрыгать» при этом ногой, а первый, 16-разрядный, тратить на это просто жалко.


Читать далее...
  • +5
  • 30 ноября 2014, 18:53
  • Kerim
  • 1

Многозадачный программный таймер, ver 2.0

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


Читать дальше

IR + USB HID = очередной пульт для компа (часть 1)



Цель данной статьи — продолжение изучения семейства STM32. Поэтому все возражения на тему «а нафига такой мощный проц для такой задачи, я в лихих 90-х делал это на тиньке» или «а в Китае такие по пять рублей пучок» сразу же идут лесом. Тем более, что заглавная картинка взята с ebay, где такой комплект продается за 4-6 баксов.
Статья разделена на три части:
1. Захват и декодирование IR-протокола (таймеры)
2. Создание HID-устройства для выполнения действий на компе без драйверов (USB-HID библиотека)
3. Программа на компе для настройки параметров
4. (опционально, если руки дойдут) Реализация устройства в железе, разводка платы и пайка

Итак, часть первая…


Читать дальше

Нестандартное использование UART в качестве генератора частоты

Недавно понадобилось подключить к устройству на MSP430 ультразвуковую микропомпу вместо привычной электромагнитной.
В общем-то, ничего особенного, нужно выдавать пачки меандра заданной частоты и в зависимости от требуемой интенсивности прокачки менять соотношение длительности пачек и пауз между ними. Если бы не пара нюансов.

1. Пьезоэлектрическая сущность новой качалки выливается в очень узкую полосу рабочих частот. Буквально 150-200Гц вправо-влево и качалка превращается в бестолковую шипелку и даже в стакане воды на глубине 2-3 см не может выдавить пузырик.
2. Рабочая частота 25,4кГц. С учетом п.1 получаем полосу в районе 25250-25600Гц.

Вроде бы, «как два пальца об асфальт». Заряжаем таймер, вешаем на хардварный выход одной из защелок нашу пищалку качалку (через повышающий драйвер, естественно, и с дифференциальным выходом), загоняем в CCR0 период, в CCR нужной защелки — полпериода, — профит!
Однако, не все так просто.


Читать дальше