Таймер "Входной захват" ?

Сеско
Пн 18 апреля 2016 г. 15:42
Привет, я использую Timer1 и Timer4 для вывода ШИМ, хорошо работает.

Теперь я хочу использовать PIN PA0, Timer2 Channel1, для захвата ввода. Есть ли примеры?
С таймером2.setMode (timer_ch1, mode) функция, какой режим я должен использовать? Что еще я должен установить?

Мне трудно найти документацию или файлы заголовков для среды Arduino-STM32. Где мне посмотреть?

Mrburnette
Пн 18 апреля 2016 г. 16:42
Привет и добро пожаловать, Сеско:

Функции прототипа для Timerx здесь

Я отсканировал наш сайт и не смог найти никаких хитов, но на старом форуме Leaflabs я нашел 2 дискуссии, которые могут помочь вам:

http: // форумы.Leaflabs.com/тема.PHP?ID = 1291

http: // форумы.Leaflabs.com/тема.PHP?ID = 737&Page = 2


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

Луча

Сеско
Пн 18 апреля 2016 г., 17:44
Улуки, я нашел в таймере.H:

/ * Timer_input_capture, todo: в этом режиме таймер может измерить длины импульсов входных сигналов */

Тодо означает, что он не реализован :(

Сеско
Вт 19 апреля 2016 г. 10:27 утра
Сделал это:
gpio_set_af_mode(TIMER5_CH1_PIN, GPIO_AFMODE_TIM3_5);

Mrburnette
Вт 19 апреля 2016 г. 13:13
Поздравляю!

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

Луча

Rogerclark
Вторник 19 апреля 2016 г., 21:46
@CESCO

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

Было бы здорово, если бы мы могли.

Сеско
Чт 21 апреля 2016 г., 11:02
> Как вы думаете, можно было бы использовать ваш код в «ядро», где он должен сделать... ?

Входной захват довольно сложный. Существуют параметры для фильтра и прескалера, захваты.

Концентрируясь на основной функции, без прекалера, без фильтра, просто параметр для подъема или фрайта. Я искал, не нашел, где таймер.С. Структуры файла довольно сложно понять.

Martinayotte
Чт 21 апреля 2016 12:31
Сеско написал:Я искал, не нашел, где таймер.С. Структуры файла довольно сложно понять.

Racemaniac
Чт 21 апреля 2016 г. 13:27
Martinayotte написал:Сеско написал:Я искал, не нашел, где таймер.С. Структуры файла довольно сложно понять.

Martinayotte
Чт 21 апреля 2016 г. 14:38
Вся эта структура каталогов поступает из устаревшего кодекса Leflab, они даже не согласованы между STM32F1 и STM32F4, но нам нужно жить с ним.

Racemaniac
Чт 21 апреля 2016 г. 14:54
Martinayotte написал:Вся эта структура каталогов поступает из устаревшего кодекса Leflab, они даже не согласованы между STM32F1 и STM32F4, но нам нужно жить с ним.

Martinayotte
Чт 21 апреля 2016 г. 15:05
Задача на данный момент слишком огромна, поэтому никто не хочет тормозить существующую иерархию.
Есть также тонны подзадач, которые мы пожелали, например, объединение много общего кода между платформами, но опять же, они тоже огромны.
Рефакторинг всегда был затруднен в любых проектах, особенно когда «время - отсутствующий ингредиент» ... :?

Racemaniac
Чт 21 апреля 2016 г. 15:16
Martinayotte написал:Задача на данный момент слишком огромна, поэтому никто не хочет тормозить существующую иерархию.
Есть также тонны подзадач, которые мы пожелали, например, объединение много общего кода между платформами, но опять же, они тоже огромны.
Рефакторинг всегда был затруднен в любых проектах, особенно когда «время - отсутствующий ингредиент» ... :?

Сеско
Пт 22 апреля 2016 г. 3:40
Что я сделал (или что я могу вспомнить):

таймер.C в STM32F1 \ System \ Libmaple \ include \ libmaple timer_set_mode () #include Adafruit_TFTLCD_16bit_STM32 tft; #define timer Timer5 #define TIMER5_CH1_PIN PA0 void setup() { tft.reset(); tft.begin(0x9341); tft.setTextSize(1); tft.setRotation(1); tft.setTextColor(BLUE); tft.fillScreen(BLACK); pinMode(TIMER5_CH1_PIN, PWM); // gpio_set_af_mode(TIMER5_CH1_PIN,GPIO_AFMODE_TIM3_5); gpio_set_af_mode(TIMER5_CH1_PIN, (gpio_af_mode)2); timer.pause(); timer.setPrescaleFactor(1); // use 42MHz internal clock timer.setOverflow(2); // output ~21MHz signal (48ns period) timer.setCompare(TIMER_CH1, 1); // 50% duty cycle: 24ns low + 24ns high timer.refresh(); timer.resume(); } void loop() { tft.println("Test"); }

Rogerclark
Пт 22 апреля 2016 г., 7:06 утра
Можете ли вы застегнуть свои файлы и прикрепить их?

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

Редактировать

Я посмотрел на код для

ATTRACTCOMPARE1RINTRUTP (ppm_input);

и эта функция устарела.

Hardwaretimer.H читает
#include #include #include #include #include #include #include //GVars--------------------------------------- volatile int s = 1; //Functions----------------------------------- static void myHandler(); int main(void){ RCC_BASE->APB2ENR |= (1 << 3); //Enabling the clock for PORTB GPIOB->regs->CRL |= ((1 << 4)|(1 << 5)); GPIOB->regs->CRL &= ~((1 << 7)|(1 << 6));//set PB1 as an output //set PB8 as an input gpio_set_mode(GPIOB, 8, GPIO_INPUT_PD); afio_init(); //Enabling AFIO clock nvic_init(0x80000000, 0x00); nvic_globalirq_enable(); nvic_irq_set_priority(NVIC_EXTI_9_5, 0x00); //Enabling interrupts and configuring priorities exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, myHandler, EXTI_FALLING); //setting up the EXTI //blinky while(1){ if(s == 1) { GPIOB->regs->BSRR = (1 << 1); delay_us(1000000); GPIOB->regs->BRR = (1 << 1); delay_us(1000000); } } } static void myHandler() { s = 0; }

Сеско
Пт 22 апреля 2016 г., 11:44
Чтение внутри обработчика прерываний: #include #include #include #include #include #include #include //GVars--------------------------------------- volatile int s = 1; //Functions----------------------------------- static void myHandler(); int main(void){ RCC_BASE->APB2ENR |= (1 << 3); //Enabling the clock for PORTB GPIOB->regs->CRL |= ((1 << 4)|(1 << 5)); GPIOB->regs->CRL &= ~((1 << 7)|(1 << 6));//set PB1 as an output //set PB8 as an input gpio_set_mode(GPIOB, 8, GPIO_INPUT_PD); afio_init(); //Enabling AFIO clock nvic_init(0x80000000, 0x00); nvic_globalirq_enable(); nvic_irq_set_priority(NVIC_EXTI_9_5, 0x00); //Enabling interrupts and configuring priorities exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, myHandler, EXTI_FALLING); //setting up the EXTI //blinky while(1){ if(s == 1) { s=0; GPIOB->regs->BSRR = (1 << 1); delay_us(1000000); GPIOB->regs->BRR = (1 << 1); delay_us(1000000); } } } static void myHandler() { s = 1; }

Mrburnette
Пт 22 апреля 2016 г. 13:00
Реданьяк написал: <...>
Как и во всех крупных проектах, старайтесь добраться с небольшими шагами, когда у вас есть время ^^ '.
<...>

Rogerclark
Пт 22 апреля 2016 г., 22:03
Привет, Рэй

Чем больше я смотрю на ядро ​​HALMX, тем больше я ценю, что Leaflabs удалось сделать с Libmaple.

Libmaple теперь выглядит ловко по сравнению с огромным количеством файлов, которые необходимы для поддержки нескольких плат в HALMX.

USB -сериал Libmaple, кажется, занимает 8K, но версия STMS, похоже, занимает 20 тыс. (Из Flash).


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


Жаловать на то, что Libmaple не использует CMSIS и т. Д., Кажется, это обычный спорт, но я едва ли вижу, что кто -то делает что -то, чтобы построить что -то лучше (@sheepdoll и @vassilis приняты) приняты)

Mrburnette
Пт 22 апреля 2016 г., 22:41
Rogerclark написал: <...>
Чем больше я смотрю на ядро ​​HALMX, тем больше я ценю, что Leaflabs удалось сделать с Libmaple. Libmaple теперь выглядит ловко по сравнению с огромным количеством файлов, которые необходимы для поддержки нескольких плат в HALMX. USB -сериал Libmaple, кажется, занимает 8K, но версия STMS, похоже, занимает 20 тыс. (Из Flash). Но нет ничего, чтобы помешать нам улучшать, добавляя, исправление ошибок и укол. Жаловать на то, что Libmaple не использует CMSIS и т. Д., Кажется, это обычный спорт, но я едва ли вижу, что кто -то делает что -то, чтобы построить что -то лучше (@sheepdoll и @vassilis приняты) приняты)

Александрос
Чт 18 января 2018 г. 14:52
Извините, ребята, это Timer_input_capture, доступный в библиотеке ?
Я хочу использовать метод захвата ввода, вместо того, чтобы прикрепить, я прочитал, что быстрее MCU/2 Speed.

Rogerclark
Чт, 08 февраля 2018 11:06
Интересный..

Я думаю, что могу использовать это в моем проекте AC Dimmer

Rogerclark
Пт. 09 февраля 2018 г., 22:00
Я пытаюсь добавить этот код в ядро

Однако есть одна вещь, которую я не понимаю.

Только один из GPIO, подключенный к каждому таймеру ?

Таймер имеет свой вход

Timer_ccmr_ccs_input_ti1

Но я не вижу, как входной штифт GPIO направляется на это ??

Редактировать.

Теперь я вижу
// // STM32duino Simple pin interrupt test. // Pressing the button triggers an interrupt, which sets/unsets the interrupt flag. // The main loop switches the LED on ot off depending on the interrupt flag // NOTE: on my board to switch ON the LED, I write a zero to the port pin.Your board may be different. volatile int buttonISRFlag = LOW; // must declare volatile, since it's // modified within the blink() handler #define INPUT_PIN PB8 #define BOARD_LED_PIN PB0 USBSerial serial_debug; void setup() { pinMode(BOARD_LED_PIN, OUTPUT); pinMode(INPUT_PIN, INPUT); attachInterrupt(INPUT_PIN, blink, CHANGE); } void loop() { // Spit out the current state of the pin, this should follow the state of buttonISRFlag // There is a delay between the two which is the lenght of time it takes to service the ISR and get back to this point in the loop // but for our purposes they will appear the same. serial_debug.print("INPUT_PINP State: "); serial_debug.println(digitalRead(BOARD_INPUT_PIN)); // // 1=LED Off, 0=LED on, so we write !buttonISRFlag to the pin. digitalWrite(BOARD_LED_PIN, !buttonISRFlag); // Spit out the state of the ISR flag. serial_debug.print("ISR Flag state: "); serial_debug.println(buttonISRFlag); delay(500); } void blink() { buttonISRFlag=!buttonISRFlag; }

Rogerclark
Сб 10 февраля 2018 г. 12:10
ХОРОШО.

Просто чтобы ответить на мой собственный вопрос...

Насколько я вижу

http: // www.ул.com/content/ccc/resource/ ... 161566.PDF

Это таймеры, которые имеют пин -код ETR

Timer1 PA12 или PE7 (Remap)
Timer2 PA0 или PA15 (Remap)
Timer3 PD2
Timer4 PE0

Но для синей таблетки и Maple Mini и т. Д. (F103CX) можно использовать только Timer2, если вы используете загрузчик, потому что PA12 (Timer1) является одним из USB -сигналов S.

Передача ETR, по -видимому, контролируется регистром AFIO_MAPR (см. Раздел 9.4.2 справочного руководства, на стр. 183)

Это имеет переиздание для таймеров 1, 2,3 и 4
Бит 12 TIM4_REMAP: TIM4 Remapping
Этот бит установлен и очищен с помощью программного обеспечения. Он контролирует отображение каналов TIM4 с 1 по 4 на
порты GPIO.
0: без remap (TIM4_CH1/PB6, TIM4_CH2/PB7, TIM4_CH3/PB8, TIM4_CH4/PB9)
1: Полный Remap (TIM4_CH1/PD12, TIM4_CH2/PD13, TIM4_CH3/PD14, TIM4_CH4/PD15)
Примечание: TIM4_ETR на PE0 не отображено.

Биты 11:10 TIM3_REMAP [1: 0]: TIM3 Remapping
Эти биты установлены и очищены программным обеспечением. Они контролируют картирование каналов TIM3 1 на
4 на портах GPIO.
00: нет Remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1)
01: не используется
10: Частичный Remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1)
11: Полный ремап (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9)
Примечание: TIM3_ETR на PE0 не отображено.

Биты 9: 8 Tim2_remap [1: 0]: im2 remapping
Эти биты установлены и очищены программным обеспечением. Они контролируют картирование каналов TIM2 1 на
4 и внешний триггер (ETR) на портах GPIO.
00: нет Remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3)
01: Частичный Remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3)
10: Частичный Remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11)
11: Полный переоборудование (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11)


Биты 7: 6 TIM1_REMAP [1: 0]: TIM1 Remapping
Эти биты установлены и очищены программным обеспечением. Они контролируют картирование каналов TIM1 1 на
4, с 1n до 3n, внешний триггер (ETR) и разрыв вход (Bkin) на портах GPIO.
00: нет Remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, Bkin/PB12,
CH1N/PB13, CH2N/PB14, CH3N/PB15)
01: Частичный Remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6,
CH1N/PA7, CH2N/PB0, CH3N/PB1)
10: не используется
11: Полный переоборудование (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, Bkin/PE15,
CH1N/PE8, CH2N/PE10, CH3N/PE12)

Rogerclark
Сб 10 февраля 2018 г. 1:22
ХОРОШО...

Изменение уже может быть обработано

// // STM32duino Simple pin interrupt test. // Pressing the button triggers an interrupt, which sets/unsets the interrupt flag. // The main loop switches the LED on ot off depending on the interrupt flag // NOTE: on my board to switch ON the LED, I write a zero to the port pin.Your board may be different. volatile int buttonISRFlag = LOW; // must declare volatile, since it's // modified within the blink() handler #define INPUT_PIN PB8 #define BOARD_LED_PIN PB0 USBSerial serial_debug; void setup() { // Break down arduino stuff to libmaple equivalent... // pinMode(BOARD_LED_PIN, OUTPUT); // gpio_init(gpio_dev * dev) gpio_init(GPIOB); // gpio_set_mode(gpio_dev * dev, uint8 pin, gpio_pin_mode mode) gpio_set_mode(GPIOB, 0, GPIO_OUTPUT_OD); // Break down arduino stuff to libmaple equivalent... //pinMode(INPUT_PIN, INPUT); gpio_set_mode(GPIOB, 8, GPIO_INPUT_FLOATING); // Break down arduino stuff to libmaple equivalent... // attachInterrupt(INPUT_PIN, blink, CHANGE); // afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) afio_init(); nvic_globalirq_enable(); exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, blink, EXTI_RISING_FALLING); afio_exti_select(AFIO_EXTI_8, AFIO_EXTI_PB ); nvic_irq_enable(NVIC_EXTI1); } void loop() { // Spit out the current state of the pin, this should follow the state of buttonISRFlag // There is a delay between the two which is the lenght of time it takes to service the ISR and get back to this point in the loop // but for our purposes they will appear the same. serial_debug.print("INPUT_PIN State: "); // Read our button // NOTE: The gpio_read_bit() call doesn't quite do the same as the digitalRead() call // serial_debug.println(digitalRead(BOARD_INPUT_PIN)); serial_debug.println(gpio_read_bit(GPIOB,8)); // 1=LED Off, 0=LED on, so we write !buttonISRFlag to the pin. //digitalWrite(BOARD_LED_PIN, !buttonISRFlag); //gpio_write_bit(gpio_dev * dev, uint8 pin, uint8 val) gpio_write_bit(GPIOB, 0, !buttonISRFlag); // Spit out the state of the ISR flag. serial_debug.print("ISR Flag state: "); serial_debug.println(buttonISRFlag); delay(500); } void blink() { buttonISRFlag = !buttonISRFlag; }

Rogerclark
Сб 10 февраля 2018 г. 1:27
Это все еще оставляет полярность.

Я думаю, что с этим, возможно, нужно обработать новую функцию gpio_xxxx, а также чтение значения из таймера

Rogerclark
Сб 10 февраля 2018 г., 2:39
Похоже, Leaflab уже написал функцию, чтобы получить значение

#include volatile int buttonISRFlag = LOW; // must declare volatile, since it's // modified within the blink() handler #define INPUT_PIN PB8 void blink(); USBSerial serial_debug; void setup() { // Break down arduino stuff to libmaple equivalent... // pinMode(BOARD_LED_PIN, OUTPUT); // gpio_init(gpio_dev * dev) gpio_init(GPIOB); // gpio_set_mode(gpio_dev * dev, uint8 pin, gpio_pin_mode mode) gpio_set_mode(GPIOB, 1, GPIO_OUTPUT_PP); // Break down arduino stuff to libmaple equivalent... //pinMode(INPUT_PIN, INPUT); gpio_set_mode(GPIOB, 8, GPIO_INPUT_PD); // Break down arduino stuff to libmaple equivalent... // attachInterrupt(INPUT_PIN, blink, CHANGE); // afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) afio_init(); nvic_globalirq_enable(); exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, blink, EXTI_RISING_FALLING); afio_exti_select(AFIO_EXTI_8, AFIO_EXTI_PB ); nvic_irq_enable(NVIC_EXTI_9_5); } void loop() { // Spit out the current state of the pin, this should follow the state of buttonISRFlag // There is a delay between the two which is the lenght of time it takes to service the ISR and get back to this point in the loop // but for our purposes they will appear the same. serial_debug.print("INPUT_PIN State: "); // Read our button // NOTE: The gpio_read_bit() call doesn't quite do the same as the digitalRead() call // serial_debug.println(digitalRead(BOARD_INPUT_PIN)); serial_debug.println(gpio_read_bit(GPIOB,8)); // 1=LED Off, 0=LED on, so we write !buttonISRFlag to the pin. //digitalWrite(BOARD_LED_PIN, !buttonISRFlag); //gpio_write_bit(gpio_dev * dev, uint8 pin, uint8 val) gpio_write_bit(GPIOB, 1, !buttonISRFlag); // Spit out the state of the ISR flag. serial_debug.print("ISR Flag state: "); serial_debug.println(buttonISRFlag); delay(500); } void blink() { buttonISRFlag = !buttonISRFlag; } int main(void){ init(); setup(); while(1) loop(); }

Rogerclark
Сб 10 февраля 2018 г., 3:50
ХОРОШО

Я добавил эту функциональность в ядро

Но. Мне все еще нужно решить, как добавить входную полярность

Я включил пример в разделе датчиков, так как именно там пример кодера аппаратного таймера

Возьмите последнюю версию репо, и вы можете попробовать пример

(Теперь о том, что я действительно хотел, что является функцией "One Pulse" ;-)
#include volatile int buttonISRFlag = LOW; // must declare volatile, since it's // modified within the blink() handler #define INPUT_PIN PB8 void blink(); USBSerial serial_debug; void setup() { // Break down arduino stuff to libmaple equivalent... // pinMode(BOARD_LED_PIN, OUTPUT); // gpio_init(gpio_dev * dev) gpio_init(GPIOB); // gpio_set_mode(gpio_dev * dev, uint8 pin, gpio_pin_mode mode) gpio_set_mode(GPIOB, 1, GPIO_OUTPUT_PP); // Break down arduino stuff to libmaple equivalent... //pinMode(INPUT_PIN, INPUT); gpio_set_mode(GPIOB, 8, GPIO_INPUT_PD); // Break down arduino stuff to libmaple equivalent... // attachInterrupt(INPUT_PIN, blink, CHANGE); // afio_exti_select(afio_exti_num exti, afio_exti_port gpio_port) afio_init(); nvic_globalirq_enable(); exti_attach_interrupt(AFIO_EXTI_8, AFIO_EXTI_PB, blink, EXTI_RISING_FALLING); afio_exti_select(AFIO_EXTI_8, AFIO_EXTI_PB ); nvic_irq_enable(NVIC_EXTI_9_5); } void loop() { // Spit out the current state of the pin, this should follow the state of buttonISRFlag // There is a delay between the two which is the lenght of time it takes to service the ISR and get back to this point in the loop // but for our purposes they will appear the same. serial_debug.print("INPUT_PIN State: "); // Read our button // NOTE: The gpio_read_bit() call doesn't quite do the same as the digitalRead() call // serial_debug.println(digitalRead(BOARD_INPUT_PIN)); serial_debug.println(gpio_read_bit(GPIOB,8)); // 1=LED Off, 0=LED on, so we write !buttonISRFlag to the pin. //digitalWrite(BOARD_LED_PIN, !buttonISRFlag); //gpio_write_bit(gpio_dev * dev, uint8 pin, uint8 val) gpio_write_bit(GPIOB, 1, !buttonISRFlag); // Spit out the state of the ISR flag. serial_debug.print("ISR Flag state: "); serial_debug.println(buttonISRFlag); delay(500); } void blink() { buttonISRFlag = !buttonISRFlag; } int main(void){ init(); setup(); while(1) loop(); }

Стивестронг
Сб 10 февраля 2018 г. 22:44
Что именно имеет пример наброска специально? Чтобы измерить высокий период пульса? Или время между двумя событиями захвата ввода?
В любом случае, чтение значений захвата в ISR - не лучший способ получить точные значения.

Rogerclark
Сб 10 февраля 2018 г., 22:52
Стив

Я только что использовал код, предоставленный @Cesco

Но теперь я вижу, что у него есть проблемы
Я думаю, что конфигурация неверна.
Счетчик, кажется, свободна, и ISR вызывается, когда входной штифт меняется.

Глядя на исходный код (из Leaflabs), они подумали, что для opt_capture будет Pinmode (), но, как вы указали на GitHub, это только позволяет только очень ограниченные функции

Так что, возможно, это не правильный способ добавить эту функциональность, и вместо этого, возможно, класс аппаратного таймера должен иметь дополнительные функции

эн.глин.

Timerx.setInputCaptUreMode (args .....)

а также

Timerx.SetonePulseMode (Args....)

Это позволило бы лучшую конфигурацию.

Стивестронг
Сб 10 февраля 2018 11:07
Роджер, вы ссылаетесь на этот пример кода: ViewTopic.PHP?f = 3&T = 2008&P = 26987#P27037 ?
Это от @konczakp, а не @cesco.

В любом случае, вы правы, он пропускает, чтобы установить таймер в режиме сброса подчиненного режима (SMS = B100) и выбрать правый триггер, чтобы значение регистра CCR1 было устойчивым после того, как произошел триггер входного сигнала.

Видеть RM0008 Rev.16, с. 383-384, глава 15.3.6 режим ввода мощности: Например, вы можете измерить период (в реестре TIMX_CCR1) и рабочего цикла (в регистре TIMX_CCR2) ШИО, применяемого на TI1, с использованием следующей процедуры (в зависимости от частоты CK_INT и значения прекалера):
• Выберите активный ввод для TIMX_CCR1: запишите биты CC1S до 01 в регистре TIMX_CCMR1 (выбран TI1).
• Выберите активную полярность для ti1fp1 (используется как для захвата в TIMX_CCR1, так и счетчика): Напишите CC1P на ‘0’ (Активно на восходящем краю).
• Выберите активный ввод для TIMX_CCR2: запишите биты CC2S до 10 в регистре TIMX_CCMR1 (выбран TI1).
• Выберите активную полярность для Ti1fp2 (используется для захвата в TIMX_CCR2): запишите бит CC2P на ‘1’ (активно на падении).
• Выберите действительный ввод триггера: запишите биты TS до 101 в регистре TIMX_SMCR (выбран TI1FP1).
• Настройка контроллера режима подчиненного в режиме сброса: запишите SMS -биты на 100 в регистре TIMX_SMCR.
• Включить захваты: напишите биты CC1E и CC2E ‘1 в регистре TIMX_CCER.
Я, я использую измерение рабочего цикла в одном из моих проектов в соответствии с этим описанием.

Справочное руководство имеет слишком много примеров (с множеством различных вариантов), которые будут поддерживаться / реализованы в ядре.
Я действительно не вижу, как должен быть изменен класс Hardwaretimer, чтобы поддержать их.
Было бы неплохо, если бы у нас был один пример наброска для всех, даже с настройками прямых регистраций. Но я думаю, что ни у кого нет необходимого времени.

Rogerclark
Солнце 11 февраля 2018 г., 3:03
Спасибо

Я посмотрю на этот другой код

Rogerclark
Солнце 11 февраля 2018 г. 10:40
Я вернул коммит, который добавил функцию захвата ввода в качестве кода, который я взял из этого потока в качестве некоторых серьезных проблем :-(

Стивестронг
Солнце 11 февраля 2018 г. 14:44
Я переработал обработку режима захвата ввода и добавил два примера:
- Входной захват + один режим импульса
- Режим ШИМ (с использованием входного захвата) для измерения импульса ШИМ и ширины периода.

https: // github.com/stevstrong/arduino_s ... DE99BA8AC0

Rogerclark
Солнце 11 февраля 2018 г. 20:35
Спасибо, Стив

Я попробую ваш код позже сегодня.

Rogerclark
Пн 12 февраля 2018 г., 7:17 утра
Стив

Я вручную скопировал ваши обновленные файлы, и ваша демонстрация HardwaretimerPwminput работала нормально.

Я не тестировал эту копию вашей демонстрации «Единственное импульс», но я предполагаю, что она такая же, как и та, которую вы опубликовали на форуме, поэтому я протестирую позже, чтобы подтвердить, что все в порядке

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

Я также могу изменить вашу демо -поддержку с одним импульсом, чтобы показать вам, чтобы использовать внешний триггер для таймера

Тогда я сделаю изменения обратно в свою репо.

КСТАТИ. Я предполагаю, что вы не можете сделать пиар, потому что ваше репо слишком отличается от моего.

Спасибо

Роджер

Стивестронг
Пн 12 февраля 2018 г. 8:23
[Rogerclark - Пн 12 февраля 2018 г., 7:17] - КСТАТИ. Я предполагаю, что вы не можете сделать пиар, потому что ваше репо слишком отличается от моего.
Действительно, потому что GitHub по -прежнему загадкой для меня, я даже не предлагал сделать пиар. Я могу сделать это для отдельных файлов на веб -github, но не для более чем одного. Извини.

Rogerclark
Пн 12 февраля 2018 г. 8:29
Не беспокойся

Это было не так много файлов, чтобы копировать вручную ;-)

Rogerclark
Вт 13 февраля 2018 г. 8:47 утра
ХОРОШО.

Я вытащил обновленные файлы с @SteVestrong, которые правильно работают для захвата ввода и OnePulse