22.10.2016, 00:10
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Аппаратный учет числа импульсов ШИМ
Пробую сделать аппаратную выдачу импульсов и учет их числа (надо для руления шаговиком), чтобы можно было запустить таймер и дальше задавать длительность импульсов каким-нибудь регистром, а число выданных импульсов вытаскивать из другого регистра. Длительность импульсов можно задать через PSC, здесь всё просто. Но несмотря на кучу счетчиков внутри одного таймера, ничего подходящего для учета импульсов не нашлось. Можно было бы использовать RCR, но он грузится в теневой регистр, к которому нет доступа. Пока осталась только одна идея, соединить два таймера в цепочку, но она может тоже не выгореть, к тому же не хочется загружать сразу два таймера.
Может есть подходящий режим таймера, чтобы он выдавал импульсы без сбрасывания счетчика?
|
|
|
|
22.10.2016, 03:04
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
А схема какая? Обычно ж шим делают микросхемой типа tb там какойто а на нее только импульсы одинаковые подают - вперед назад столько то шагов. Их и считают хоть софтово это уже несложно
__________________
кагмаподэ магмаподэ
|
|
|
|
22.10.2016, 15:46
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Вот как раз софтово посчитать сложно, я с этим и завис. Схема - микроконтроллер stm32f100, он выдает импульсы STEP/DIR на другую плату, а у неё уже без разницы какое устройство. Хочу сделать выдачу STEP аппаратно и использовать для этого режим ШИМ таймера, чтобы ядро не грузить ручным ногодрыгом.
|
|
|
|
22.10.2016, 16:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,509
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Ну, я так полагаю, надо не считать генерируемые импульсы, а наоборот, генерировать заданное число импульсов.
Это сделать аппаратно несложно. Достаточно объединить два таймера.
Например, вот так.
Первый таймер будет выдавать импульсы, а второй - разрешать работу первого в течение некоторого промежутка времени.
Первый таймер настраивается на запуск от внутреннего триггера ITR, в режиме Gated (регистр SMCR), а второй таймер будет выдавать сигнал TRGO, равный OC1REF второго таймера. Второй таймер должен работать в режиме однократного запуска.
Первый таймер работает в режиме PWM mode 2 со величиной шим 50%.
Есть конечно некоторые неудобства, но в целом, работает. Аппаратно генерируется заданное число импульсов.
|
|
|
|
22.10.2016, 16:52
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
backlan, Как вариант, перебрасывать с таблицы данные в регистры таймера через DMA. Минус - расход флэша, плюс- все под контролем..
__________________
Осторожно , злой кот
|
|
|
|
22.10.2016, 17:07
|
|
Вид на жительство
Регистрация: 03.06.2006
Адрес: Израиль
Сообщений: 388
Сказал спасибо: 2,067
Сказали Спасибо 337 раз(а) в 156 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Может я чего и недопонял, но я вот так делаю:
Код:
|
//Sends stepper pulses and sets the stepper direction
void stepper_generate_step(uint8_t dir, uint8_t steps)
{
stepper_set_dir (dir);
//Arm repetition counter
TIM15-›RCR = steps;
//Start the timer
TIM15-›CR1 |= 0x01;
}
void TIM15_IRQHandler(void)
{
//Clear timer interrupt flags
TIM15-›SR &= ~TIM15-›SR;
//Stop the timer
TIM15-›CR1 &= ~0x01;
} |
Инициализация:
Код:
|
//Automatic Reload Register
TIM15-›ARR = 2000;
TIM15-›CCR1 = TIM15-›ARR / 2;
//ARPE ENABLE
TIM15-›CR1 |= 0x80;
//TRG0 on update enable
TIM15-›CR2 |= 0x20;
//Interrupt enable
TIM15-›DIER |= 0x01;
//Repetion counter
TIM15-›RCR = 0x00;
//Set prescaler
TIM15-›PSC |= 0x10;
/* (4) Select PWM mode 1 on OC1 (OC1M = 110),
enable preload register on OC1 (OC1PE = 1) */
/* (5) Select active high polarity on OC1 (CC1P = 0, reset value),
enable the output on OC1 (CC1E = 1)*/
/* (6) Enable output (MOE = 1)*/
/* (7) Enable counter (CEN = 1)
select edge aligned mode (CMS = 00, reset value)
select direction as upcounter (DIR = 0, reset value) */
/* (8) Force update generation (UG = 1) */
TIM15-›CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; /* (4) */
TIM15-›CCER |= TIM_CCER_CC1E; /* (5) */
TIM15-›BDTR |= TIM_BDTR_MOE; /* (6) */
TIM15-›CR1 |= TIM_CR1_CEN; /* (7) */
TIM15-›EGR |= TIM_EGR_UG; /* (8) */ |
|
|
|
|
22.10.2016, 17:14
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Так, уже ближе . Да, если надо выдать определённое число импульсов и не менять при этом их длительность, тогда это решение подходит. Но мне нужно именно считать импульсы, чтобы можно было рулить скоростью в процессе перемещения. Когда мотор разгоняется, включаю таймер, задаю большое время между шагами, потом в процессе разгона его уменьшаю. Когда подъезжает к концу, уменьшаю скорость. Была идея сделать это с использованием DWT, чтобы считать число шагов на основании прошедших тактов процессора. То есть просто поделить число тактов на длительность шага и получить число шагов. Но здесь та же проблема с изменением интервала между шагами, поскольку это делается не аппаратно, то пока из DWT будет браться значение, таймер может успеть выдать ещё один импульс.
|
|
|
|
22.10.2016, 17:16
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,416
Сказал спасибо: 176
Сказали Спасибо 3,128 раз(а) в 2,017 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Сообщение от backlan
|
Вот как раз софтово посчитать сложно, я с этим и завис. Схема - микроконтроллер stm32f100, он выдает импульсы STEP/DIR на другую плату, а у неё уже без разницы какое устройство. Хочу сделать выдачу STEP аппаратно и использовать для этого режим ШИМ таймера, чтобы ядро не грузить ручным ногодрыгом.
|
зачем там шим я никак не пойму
__________________
кагмаподэ магмаподэ
|
|
|
|
22.10.2016, 17:33
|
|
Частый гость
Регистрация: 06.10.2008
Адрес: Ростов-на-Дону
Сообщений: 49
Сказал спасибо: 5
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Сообщение от индюк
|
зачем там шим я никак не пойму
|
Канал ШИМ, чтобы шаги выдавать. Вот как раз написали пример с 50% заполнения.
|
|
|
|
22.10.2016, 17:37
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,861
Сказал спасибо: 2,532
Сказали Спасибо 11,773 раз(а) в 5,897 сообщении(ях)
|
Re: Аппаратный учет числа импульсов ШИМ
Сообщение от backlan
|
а число выданных импульсов вытаскивать из другого регистра.
|
Не пойму - чем не нравится счетчик в обработчике прерывания? "Загрузка ядра?" Мои тапочки смеются при такой мысли.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:37.
|
|