Jump to content

Search the Community

Showing results for tags 'таймер'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
  • Радиоэлектроника для профессионалов
    • Автомобильная электроника
    • Питание
    • Ремонт
    • Системы охраны и наблюдения. Личная безопасность
    • Роботы и модели на ДУ-управлении
    • Световые эффекты и LED
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Металлоискатели
    • Автоматика
    • Электрика
    • Промышленная электроника
    • Измерительная техника
    • Мастерская радиолюбителя
    • КВ и УКВ радиосвязь
    • Жучки
    • Сотовая связь
    • Спутниковое ТВ
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Схемотехника для профессионалов
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 11 results

  1. Добрый день. Подскажите пожалуйста, как бы мне реализовать схему автоотключения (забытого включенного света). Что есть: 12v аккумулятор, LED-лента, выключатель. Хочу собрать схему, при которой питание на LED-ленту будет подаваться не более чем N-минут. Всё что находил - это схемы через мосфет и конденсатор но с тач-кнопкой, это не совсем то, т.к. необходимо срабатывание "таймера" при замыкании цепи и отключение таймера и света при размыкании цепи. Желательно, что бы потребление схемы было минимальным, а в идеале - размыкание всей цепи по таймеру.
  2. Изучаю прерывания на attiny13. Пока остановился на прерываниях по переполнению. Сделал тестовый код в Atmel Studio и сразу через программатор заливаю на тиньку со светодиодом. Проблема в том что гореть он должен 10 секунд и выключаться, а горит примерно 20-23 секунды. Прошу помощи в правильном расчёте. Код ниже (пока учусь сильно не ругайтесь) : #define F_CPU 1000000 #define LED PB2 #include <avr/io.h> //#include <util/delay.h> #include <avr/interrupt.h> unsigned char work_time =384; // 1000000/1024/256=3.8 (0.026 сек) 10/0.026=384 volatile unsigned char temp =0; ISR (TIM0_OVF_vect) { TCNT0=0x00; temp ++; if (temp>=work_time) { PORTB &=~(1<<LED); //Инвертируем состояние TCCR0B=0x00 // остановка таймера cli (); //общее запрещение прерываний } } int main (void) { init(); while (1) { } } void init () { DDRB |= (1<<LED); // выход PORTB =(1<<LED); //включен TCCR0B =0x05; // установка делителя на 1024 TIMSK0 |= _BV(TOIE0); sei(); // Либо SREG |= (1<<SREG_I); //Разрешаем прерывания глобально TCNT0 = 0X00; //Обнулить счётный регистр }
  3. Здесь, в теме, я коротко информировал о том, что когда-то, давным-давно (в начале 80-х прошлого века), когда пленочная фотография была ещё востребованной, я сваял аналоговый таймер (реле времени) для микрофильмирования с помощью электромагнитного спуска к фотоаппарату "Зенит" (для печати было другое, цифровое, еще на 172-й серии). В нынешние времена, с завершением "эры" пленочной фотографии, надобность в подобном таймере сократилась до небольшой ниши экспонирования фоторезиста, но полностью так и не пропала. Именно поэтому я и рискнул описать принцип его реализации. "Фишкой" того таймера была нелинейная шкала выдержек. В широко распространенных и в то время (да и сейчас) таймерах шкала выдержек равномерная, из-за чего (к примеру) выдержка длительностью 1 с отличается от 2 с в два раза, а 9 с от 10 с - всего на 11%. Поэтому пересчет выдержки при изменении ее длительности приходилось делать "в уме", естественно, приближенно. Поэтому диапазон выдержек был разбит на 5 троек значений + еще одно, всего 16 (в наличии был пакетник на столько положений). Каждое следующее значение отличалось от предыдущего в 1,29 раза (корень кубический из двух). Дискретность при этом получилась, равной 1...1,26...1,59...2...2,52...3,18...4... и т.д. до 32 с. Она была подсказана моим хорошим приятелем - экспертом-криминалистом в области фотографии и подтвердилась в процессе эксплуатации. Дискретность 1...2...4...8... являлась слишком грубой. Обдумывалась дискретность 1,41 (корень квадратный из 2), но была признана тоже грубоватой, а вот 1,19 (корень 4-й степени из 2) - излишне дробной. Точность отработки выдержки аналоговым способом составляла (на глазок) примерно ±10%, что меня более-менее удовлетворяло, хотя уже тогда возникала мысль, как реализовать эту схему на цифровой компонентной базе. Однако, до реализации в "железе" дело так и не дошло, поскольку "эра" пленочной фотографии взяла и подошла к концу. А идея осталась... Вот ее-то я и хочу описать, как реализовать подобное в цифровом виде. Естественно, "та" схема за давностью лет не сохранилась, поэтому для данной записи я вчерне восстановил ее по памяти (в виде ФУНКЦИОНАЛЬНОЙ схемы, т.е., не привязанной ни к какой серии логики, ТТЛ либо КМОП!). При этом не отображены некоторые нюансы конкретной реализации, которые будут зависеть от типа использованной логики. Важна ведь не сама схема, как таковая, а ПРИНЦИП ее функционирования! Для знакомых с микроконтроллерами (сам я, к сожалению, уже "опоздал") не составит особого труда реализация алгоритма, на котором базируется схема, на МК. Если найдутся желающие - готов за отдельную, весьма умеренную плату даже изготовить такой таймер "в железе". Либо, что обойдется дешевле, крякнуть и доработать схему до принципиальной на желаемой компонентной базе (кроме МК, естественно). Итак, функциональная схема такого таймера: Главным "действующим лицом" является триггер "Т", управляющий ключевым каскадом на транзисторе VT1. Его нагрузкой показано реле К1, коммутирующее сетевую нагрузку. Вместо него можно применить (если финансы позволят) либо оптореле, либо связку из оптрона серии МОС30хх + симистор. Хотя и ПМСМ реле более, чем достаточно. Пара сотен/тысяч коммутаций оно по-всякому выдержит. Запуск триггера производится динамически (по фронту входного сигнала) на сход С, а сброс в ноль - статически по входу R, который имеет преимущество перед запуском. Генератор G1 на выходе формирует тактовую частоту 100 Гц, которая двоичным счетчиком СТ2.1 делится на одно из трех значений: 100, 126 или 159, выбираемое мультиплексором MUX1 в зависимости от положения многопозиционного переключателя SB. Эта уже низкая частота поступает на вход двоичного делителя СТ2.2, который делит ее дальше на 2, 4, 8, 16 и 32. Можно и больше, но тогда может быть сложно найти пакетник на нужное число положений. С выхода этого счетчика выходной сигнал через мультиплексор MUX2 поступает на вход обнуления триггера Т, прекращая формирования выдержки. Отработку выдержки можно оборвать в любой момент кнопкой "Стоп". На первый взгляд схема сложновата, но реально правильно спроектированный цифровой автомат в настройке не нуждается и начинает работать сразу.
  4. Вынес то что не получается в упрощенной форме в отдельный проект. Среда разработки CooCox 1.7.8, микроконтроллер STM32F103C8T6. Нужно раз в ~100 мсек формировать на ножке МК, например,такую последовательность: Стартовую длительность формирует таймер, в первом же своем прерывании по совпадению активирует DMA и дальше уже DMA по запросу таймера загружает значение CCR из массива. Что то похожее на управление светодиодами WS2812B. То что я сочинил выдает на пин: Но только один раз при первом вызове. При последующих вызовах данные из массива выдаются без первоначальной длительности в 150 мкс. Не могу найти ошибку. #include <stm32f10x.h> #include <stm32f10x_conf.h> #include <stm32f10x_gpio.h> #include <stm32f10x_rcc.h> #include <stm32f10x_tim.h> #include <stm32f10x_dma.h> GPIO_InitTypeDef PIN; TIM_TimeBaseInitTypeDef TIM_Config; TIM_OCInitTypeDef TIM_OCConfig; DMA_InitTypeDef DMA_Setting; uint8_t Test_Buf[] = {15,30,30,30,15}; void delay_ms(uint32_t ms) { volatile uint32_t nCount; RCC_ClocksTypeDef RCC_Clocks; RCC_GetClocksFreq (&RCC_Clocks); nCount = (RCC_Clocks.HCLK_Frequency/10000)*ms; for (; nCount != 0; nCount--); } void Init_GPIO(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); PIN.GPIO_Pin = GPIO_Pin_11; // PA11 -> TIM1 Channel4 PIN.GPIO_Mode = GPIO_Mode_AF_PP; PIN.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &PIN); } void Init_TIM_Transmit(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructInit(&TIM_Config); // настройки по дефолту TIM_Config.TIM_Prescaler = 72-1; // Запускаем таймер на тактовой частоте 1 MHz (72000000/(72-1)) TIM_Config.TIM_Period = 150-1; // Период - 150 мкс TIM_Config.TIM_ClockDivision = 0; // частоту дополнительно не делим TIM_Config.TIM_CounterMode = TIM_CounterMode_Up; // считаем вверх TIM_TimeBaseInit(TIM1, &TIM_Config); // Инициализируем TIM1 TIM_OCStructInit(&TIM_OCConfig); // настройки по дефолту TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1; // Конфигурируем как ШИМ (выравнивание по границе) TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable; // Включаем выход TIM_OCConfig.TIM_Pulse = 0; // CCR до старта пока нулевой TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High; // Полярность TIM_OCConfig.TIM_OCIdleState = TIM_OCIdleState_Reset; // состояние выхода по совпадению CCR (сброс) TIM_OC4Init(TIM1, &TIM_OCConfig); // Инициализируем 4-й выход таймера, это PA11 TIM_ARRPreloadConfig(TIM1,ENABLE); // Предзагрузка периода (ARR) TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); // Предзагрузка длины импульса CCR 4-го канала // (даем досчитать до конца и только потом значение меняется на новое) TIM_DMACmd(TIM1,TIM_DMA_CC4,DISABLE); // выключаем пока запрос к DMA от таймера TIM1 по достижении CCR) TIM_CtrlPWMOutputs(TIM1, ENABLE); // включаем выходы (это только для TIM1) TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Enable); // разрешаем таймеру управлять выводом PA11 TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE); // запрещаем пока таймеру генерировать прерывание по совпадению NVIC_EnableIRQ(TIM1_CC_IRQn); // разрешаем прерывания TIM_Cmd(TIM1, DISABLE); // Выключаем таймер (пока ждем) } void TIM1_CC_IRQHandler(void) // прошло 130 мкс { if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) { // по совпадению TIM_ClearITPendingBit(TIM1,TIM_IT_CC4); // сбрасываем флаг прерывания TIM1 по совпадению } NVIC_EnableIRQ(TIM1_CC_IRQn); // выключаем прерывания от таймера TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE); // TIM1->ARR = 40-1; // устанавливаем период 40 мкс TIM1->CCR4 = Test_Buf[0]; // ширину из массива для следующего импульса DMA1_Channel4->CNDTR = 4; // длина данных для DMA на 1 меньше т.к. уже установили выше 1 элемент TIM_DMACmd(TIM1,TIM_DMA_CC4,ENABLE); // разрешаем таймеру делать запрос к DMA по совпадению CCR DMA_Cmd(DMA1_Channel4, ENABLE); // включаем DMA } void Init_DMA(void) { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // включаем тактирование DMA1 DMA_Setting.DMA_PeripheralBaseAddr = (uint32_t) &TIM1->CCR4; // куда копировать DMA_Setting.DMA_MemoryBaseAddr = (uint32_t) &Test_Buf[1]; // что копировать DMA_Setting.DMA_DIR = DMA_DIR_PeripheralDST; // копируем в периферию (Peripheral Destination, точка назначения - периферия) DMA_Setting.DMA_BufferSize = 0; // количество передаваемых данных DMA_Setting.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // адрес периферии постоянный DMA_Setting.DMA_MemoryInc = DMA_MemoryInc_Enable; // адрес в памяти увеличиваем DMA_Setting.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // периферия 16 бит DMA_Setting.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // массив 8 бит DMA_Setting.DMA_Mode = DMA_Mode_Normal; // режим обычный DMA_Setting.DMA_Priority = DMA_Priority_Medium; // приоритет средний DMA_Setting.DMA_M2M = DMA_M2M_Disable; // MemoryToMemory откл. DMA_Init(DMA1_Channel4, &DMA_Setting); // TIM1_CH4 относится к 4-му каналу DMA1 DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); // настраиваем прерывание по окончанию передачи NVIC_EnableIRQ(DMA1_Channel4_IRQn); // включаем прерывания от 4-го канала DMA1 DMA_Cmd(DMA1_Channel4, DISABLE); // пока выключаем 4-ый канал DMA1 } void DMA1_Channel4_IRQHandler(void) // закончили передавать { if (DMA_GetITStatus(DMA1_IT_TC4) != RESET) { // по совпадению DMA_ClearITPendingBit(DMA1_IT_TC4); // сбрасываем флаг прерывания DMA1 Channel4 transfer complete } if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) { // по совпадению TIM_ClearITPendingBit(TIM1,TIM_IT_CC4); // сбрасываем флаг прерывания TIM1 на всякий случай } TIM1->ARR = 150-1; // вновь настраиваем на период 150 мкс TIM1->CCR4 = 0; // и ждем следующею передачу TIM1->CNT = 0; // TIM_DMACmd(TIM1,TIM_DMA_CC4,DISABLE); // всё выключаем DMA_Cmd(DMA1_Channel4, DISABLE); // TIM_Cmd(TIM1, DISABLE); // TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE); // TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Disable); } int main(void) { Init_GPIO(); Init_TIM_Transmit(); Init_DMA(); delay_ms(1000); while(1) { TIM1->CCR4 = 130-1; // до включения линия удерживается в 0 (CCR=0) TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE); TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Enable); TIM_Cmd(TIM1, ENABLE); delay_ms(100); } } TEST_TIM_DMA.zip
  5. Не могу настроить таймер 0 на работу, и даже не получается понять в чем проблема. Делаю в Proteus, так как это быстрее и нагляднее. Пробовал и просто по переполнению делать прерывание (WGM[1..0] 00) и по совпадению (WGM[1..0] 10; OCR0A = 0 - 255), однако прерываний нет. Перед циклом ставлю TCNT0 = 0; Тактирование выставляю TCCR0B (CS[2..0] 001, 100, 101). Прерывания TIMSK0 (OCIE0A, TOIE0) выставляю, не вызываются. Даже принудительным заносом значения в регистр TIFR0 (OCF0A, TOV0). Прерывание пытаюсь выполнить таким образом: #include <avr/interrupt.h> volatile unsigned int A = 0; ISR(TIMER0_OVF_vect) { A = 1; } ... while(1) { if (A == 1) PORTB |= (1<<0); } Proteus показывает, что вывод настроен как выход, но всегда 0; Конкретный код привести не могу, так как у меня не заработало совсем ничего. Внизу я сделал вырезку из даташита на ATMEGA328 по 0 таймеру 8-бит, и занес в один PDF файл. ATmega328-106-112.pdf Прошу помочь разобраться с таймером и прерываниями для него.
  6. Добрый день. Помогите пожалуйста. Никак не могу найти простую схему, что не впишу все одно получаю таймер на отключение или через кнопку... Делаю инкубатор для яиц, яйца нужно поворачивать 2-3 раза в сутки, у меня есть суточный таймер но у него минимум 1 минута, а мой механизм за 1 минуту прокрутит яйца 4 раза, нужно сделать примерно 15 сек. Как правильно называется такой таймер, или дайте схему. Спасибо.
  7. Добрый день всем! Столкнулся с такой проблемой. Купил несколько китайских реле времени, но они по питанию на 220 В. Теперь хочу их переделать на 24В переменку, возможно кто-то уже имел дело с такой задачей... Тип таймеров AH2-Y.
  8. Всем доброго времени суток. Решил я сделать "умную" электронную сигарету на arduino. Концепция заключается в кнопочном управлении мощностью посредством ШИМ, наличии экрана, и некоторыми защитами в виде ограничения максимального времени нажатия и уход камня в сон (режим пониженного энергопотребления) после N секунд простоя. Вводные: по нажатию кнопки запускается ШИМ и управляет полевиком, но в целях защиты я хочу ограничить время выполнения кода до 7 секунд(что бы при случайном зажатии кнопки в кармане не получить травматическую ампутацию конечностей) Проблема пришла откуда не ждали - обработка нажатой основной кнопки срабатывает как попало. Нажимая кнопку обработчик может сработать сразу и отработает как по маслу, а может и через 5 нажатий не сработать вовсе. Проверял в живую на Arduino UNO, Pro Mini (328е Меги) и в Proteus'е. Симптомы одни и те же. Проблема очевидно в коде но я в упор не вижу в чем может быть загвоздка. Уровень у меня "штота умею" поэтому не судите строго. #define pwmPin 5 #define buttonStart 3 #define maxOnTime 7000 //максимальное время выполнения условия нажатой кнопки #define RED_LED 7 #define GREEN_LED 8 int power = 150; //boolean StartState; boolean StartStateFlag; //Флаг кнопки Старт unsigned long pressTime; void setup() { pinMode(pwmPin, OUTPUT); pinMode(buttonStart, INPUT); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); Serial.begin(9600); //чисто для отладки } void loop() { if (digitalRead(buttonStart) && StartStateFlag && ((millis() - pressTime) <= maxOnTime)) { // (1) если кнопка старт нажата И была отпущена И нажата менее 7 секунд выполняем: analogWrite(pwmPin, power); //запуск ШИМ Serial.println("PWM_ON"); digitalWrite(GREEN_LED, HIGH); digitalWrite(RED_LED, LOW); } else { // (2) иначе StartStateFlag = false; // кнопка небыла отпущена analogWrite(pwmPin, 0); digitalWrite(GREEN_LED, LOW); Serial.println("PWM_OFF"); pressTime = millis(); } if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата analogWrite(pwmPin, 0); //остановка ШИМ Serial.println("PWM_OFF"); digitalWrite(RED_LED, HIGH); StartStateFlag = true; //была отпущена и можно входить в условие с нажатой кнопкой (1) } } И файлы: сам скетч, .elf и .hex для шПротеуса и проект Протеус. P. S. ШИМ в Протеусе не работает в принципе, в железе все ОК BUTTON_TEST.ino BUTTON_TEST.ino.eightanaloginputs.hex BUTTON_TEST.ino.elf BUTTON_TEST.ino.with_bootloader.eightanaloginputs.hex ButtonTest.pdsprj
  9. Доброго времени суток. Помогите отремонтировать электронный таймер электроплиты Kaiser. После мойки плиты таймер перестал подавать признаки жизни. При включении в сеть срабатывают реле и всё.
  10. Привет! Ребята, помогите совсем начинающему. Задача поморгать светодиодом не прибегая к регистрам GPIO. Плата STM32F407VG DISC. В CubeMX 5 подключаю кварц, тактирование подгоняю 16МГц для АРВ1. В TIM5 для Channel1 выбираю Forced Output CH1. Ему соответствует PA0. В таймере пределитель беру 15999, счетчик 999. То есть рассчитываю что будет дергать ногу раз в секунду. Вешаю на PA0 светодиод. Все это выгружаю в Keil 5. Дописываю в main /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim5); /* USER CODE END 2 */ Собираю, загружаю, но ничего не происходит. Причем первые разы как то получилось, но теперь глухо. Посоветуйте что делать? Какие то файлы приложить?
  11. Всем привет. Реебят подскажите, преедложили собрать схему таймера с отключением через 1-2 часа (время нее сильно суть меняет), но собрать на микросхемах К561ТР2 и К561ИЕ16. Теорию вроде пока говорили понял, но на практике что-то не срослось ((( Нарисовал схему как смог. Что не так делаю ? Спасибо
×
×
  • Create New...