Частота Таймера на 100 кГц в Windows XP

Я соглашаюсь, что необходимо узнать о компиляции M-x (свяжите ту и следующую ошибку M-x с коротким сочетанием клавиш).

Узнают о привязке для управления версиями (например, vc-diff, vc-next-action, и т.д.)

Изучают регистры. Не только можно помнить местоположения в буферах, но и целых конфигурациях окна (C-x r w - window-configuration-to-register).

6
задан Peter Mortensen 8 December 2009 в 18:20
поделиться

16 ответов

Невозможно. Самый быстрый таймер, доступный в Windows, составляет 1 мс (1 кГц). Вам понадобится операционная система реального времени или выделенный контроллер. Даже в ОС реального времени ваш максимум обычно составляет около 20 кГц.

10
ответ дан 8 December 2019 в 02:35
поделиться

Windows Мультимедийные таймеры могут дать вам 1 мс.

0
ответ дан 8 December 2019 в 02:35
поделиться

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

Однако, если вы написали свой собственный драйвер, вы могли бы использовать таймеры HPET (доступны не на всех машинах, но поставляются с большинством новых ) и, возможно, таймер APIC (не уверен, что это может дать вам 100 кГц) и получить оттуда 100 кГц .. Это довольно сложно, поэтому вам придется провести гораздо больше исследований.

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

0
ответ дан 8 December 2019 в 02:35
поделиться

В последнее время я сам работал с маршрутизатором с ЧПУ, используя ядро ​​Linux в реальном времени, проблема, которую вы видите, заключается в отсутствии вытеснения в реальном времени в Windows XP. Я не могу просматривать материалы Mach3 отсюда, но единственный способ, которым он должен работать, - это использовать драйвер "уровня ядра" в Windows. (извините, я не особо разбираюсь в Windows, поэтому не знаю подробностей). Написание какого-то драйвера для обхода модели вытеснения Windows по умолчанию - это ваш ответ, хотя я бы начал с того, что немного узнал о драйверах Windows и, возможно, посмотрел на исправления реального времени для ядра Linux для справки.

http: //www.kernel .org / pub / linux / kernel / projects / rt /

0
ответ дан 8 December 2019 в 02:35
поделиться

Основная проблема при использовании ПК для управления движением без специального оборудования - это скорость передачи данных различных выходов, встроенных в большинство ПК. Если у ваших клиентов нет бюджета на упомянутый вами высокопроизводительный контроллер движения, они просто не будут иметь доступа к сигналам 100 кГц.

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

Обратной стороной является то, что буферизация, вероятно, приведет к некоторой задержке в системе, что может повлиять на работу схемы управления с обратной связью с управлением в программном обеспечении. Еще один недостаток - это ограничивает ваши варианты частоты. Одним из самых быстрых вариантов ввода-вывода на ПК, который не обеспечивает высокопроизводительное управление потоком, такое как USB или SATA, на самом деле является аудиопорт, но он ограничен 64 кГц или 44 кГц в большинстве систем.

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

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

РЕДАКТИРОВАТЬ Хм ... Кажется, параллельны порты работают немного быстрее, чем раньше. Машина с расширенным параллельным портом (EPP) может предоставить вам до 2 Мбит двоичной пропускной способности, что должно быть в пределах досягаемости вашей цели. Однако, из-за того, как работает параллельный интерфейс, скорость передачи данных зависит от периферийного устройства, а не от некоторой предопределенной скорости буфера. По сути, периферийное устройство подтверждает, что оно получило данные или что оно готово отправить данные для каждого переданного байта.

Это не так уж и плохо, потому что простое периферийное устройство с синхронизацией легко настроить.

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

Ввод-вывод на таком порту обычно управляется прерыванием. Помимо нескольких состояний ошибок, наиболее полезные прерывания генерируются, когда входной или выходной FIFO ' достигают определенного уровня. Вы можете использовать это прерывание для записи (или чтения) новых данных в порт. Порог может быть от 1 до 16 байт. Вам следует тщательно проверить (с помощью логического анализатора / осциллографа), что данные действительно передаются с ожидаемой скоростью с ожидаемой скоростью. Вы можете сделать это почти так же хорошо в программном обеспечении, используя QueryPerformanceCounter .

0
ответ дан 8 December 2019 в 02:35
поделиться

Хотя я подозреваю, что решение meomaxy - лучшее ...

Если вам нужна дифференциальная синхронизация с высоким разрешением, у Intel есть код здесь , который утверждает точность до наносекунды. . (Также есть хорошее обсуждение общих возможностей дифференциальной синхронизации).

1
ответ дан 8 December 2019 в 02:35
поделиться

Windows XP не является системой реального времени, и я не думаю, что есть способ гарантировать таймеры в диапазоне 10 микросекунд. Вы можете поискать в библиотеке Microsoft.Ccr.Core , я думаю, она самая близкая к вам.

Edit: Я нашел дополнительную информацию от Microsoft. Согласно статье базы знаний Как использовать QueryPerformanceCounter to Time Code ,

Function                 Units                      Resolution
---------------------------------------------------------------------------
Now, Time, Timer         seconds                    1 second
GetTickCount             milliseconds               approx. 10 ms
TimeGetTime              milliseconds               approx. 10 ms
QueryPerformanceCounter  QueryPerformanceFrequency  same

и это в контексте статьи, которая начинается с утверждения:

Когда код времени для идентификации узкие места производительности, вы хотите используйте таймер с самым высоким разрешением

Роберт Харви прав, QueryPerformanceFrequency находится в диапазоне десятков микросекунд, но я не думаю, что есть способ использовать его для точного запуска событий. Я думаю, что это полный перебор для программного решения. Вы смотрели на какие-нибудь чипы вроде Arduino, которые довольно дешевы? Судя по форуму Arduino , кажется, что точность в 10 микросекунд возможна.

2
ответ дан 8 December 2019 в 02:35
поделиться

Возможно, вы могли бы использовать что-нибудь из этого:

http://www.geisswerks.com/ryan/FAQS/timing.html

Ищите QueryPerformanceFrequency, но, возможно, другие решения может быть полезно.

1
ответ дан 8 December 2019 в 02:35
поделиться

Когда вы говорите «периодический таймер», я полагаю, вы имели в виду генератор импульсов?

Вы предлагаете таймер, который будет генерировать событие каждые 10 микросекунд? Я сомневаюсь, что вам стоит это делать.

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

Рассматривали ли вы генератор импульсов USB? Или дешевая « звуковая карта USB », предназначенная для этой операции?

2
ответ дан 8 December 2019 в 02:35
поделиться

Лучшее, что вы можете сделать для синхронизации в Windows, - это QueryPerformanceFrequency / QueryPerformanceCounter . Самая низкая частота, которую я видел, составляет 1,1 МГц, так что это дает достаточную частоту.

Но даже с этим, как указывали другие ответы, это не сработает. Window не является операционной системой реального времени и не дает никаких гарантий времени. Невозможно убедиться, что ваш код выполняется каждые 1 мкс (для 100 кГц), поскольку Windows будет переключаться на другие процессы или код ядра.

Вам придется использовать какое-то внешнее аппаратное решение для получить такой срок.

2
ответ дан 8 December 2019 в 02:35
поделиться

С помощью QueryPerformanceCounter в цикле на текущих процессорах можно получить довольно близкий к 100 кГц опрос.

Например:

typedef void ( *CallbackProc )();

void PollAtKhz( int khz, CallbackProc const &Callback )
{
    int hz = khz * 1000;
    LARGE_INTEGER li;

    QueryPerformanceFrequency( &li );

    if( li.QuadPart < hz )
        return;

    __int64 diff = li.QuadPart / hz;
    LARGE_INTEGER NextStop;
    LARGE_INTEGER CurStop;

    QueryPerformanceCounter( &NextStop );
    NextStop.QuadPart += diff;

    while( true )
    {
        QueryPerformanceCounter( &CurStop );

        if( CurStop.QuadPart >= NextStop.QuadPart )
        {
            Callback();

            QueryPerformanceCounter( &NextStop );
            NextStop.QuadPart += diff;
        }
    }
}

В моем тесте я получил частоту примерно 92-98 кГц, используя этот код для тестирования:

void TestCallBack()
{
    static int i = 0;
    static time_t LastTime = time( NULL ) + 1;

    ++i;
    if( time( NULL ) >= LastTime )
    {
        printf( "%d / sec\r\n", i );
        LastTime = time( NULL ) + 1;
        i = 0;
    }
}

Очевидно, что этот код требует максимальной загрузки ЦП, поэтому для получения этих результатов необходима машина SMP . Кроме того, также помогает перенос приоритета процесса / потока в режим реального времени.

7
ответ дан 8 December 2019 в 02:35
поделиться

Что именно должен делать этот таймер? Если ему просто нужно выводить прямоугольный сигнал от 25 кГц до 100 кГц, вам понадобится дополнительное оборудование, но не возмутительно дорогое оборудование. Например, посмотрите на DT-340 из Data Translation. Он может работать даже быстрее, чем вам нужно, и я считаю, что он может даже вызвать прерывание. Или этот PCI 8255/8254 48 I / O .

Если вы можете позволить себе 500 долларов США или около того в вашем бюджете, должно быть множество вариантов оборудования. Фактическая микросхема программируемого таймера должна быть намного дешевле, поэтому, если вы хотите развернуть свою собственную схему и связать ее с компьютером, вы, вероятно, сможете сделать намного лучше, чем 500 долларов США.

Однажды я построил схему вокруг нее. микросхема программируемого интервального таймера Intel 8253, который использовался внутри оригинального IBM PC для генерации звуковых сигналов из внутреннего динамика. Он был подключен к кристаллу 1,193182 МГц и имеет делитель на 16 бит. Этот чип существует уже несколько десятилетий. Если вам нужно лучшее, я уверен, что с тех пор были внесены улучшения.

Когда я говорю, что чип 8253 (или 8254) внутри ПК используется для управления внутренним динамиком, я не завершаю. В Википедии есть еще много информации о Intel 8253 . Там объясняется, что выход 0 используется для генерации прерывания синхронизации, выход 1 используется для синхронизации обновления DRAM, а выход 2 используется для управления внутренним динамиком.

Первые два выхода синхронизации генерируют прерывания, что вы и хотите , но приведенное выше описание того, что в настоящее время делают эти выходы, должно дать вам некоторую паузу, чтобы отразить, что изменение их поведения, возможно, заставит Windows XP заметить. Третий выход на динамик в основном безвреден, но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.

Вероятно, Mach 3 использует Высокопроизводительный таймер событий (HPET), который, согласно здесь , является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.

«Прерывание таймера 2 ICH HPET может быть но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.

Вероятно, Mach 3 использует High Performance Event Timer (HPET), который согласно здесь является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.

«Прерывание таймера 2 ICH HPET может быть но вам нужно будет найти способ перенаправить этот сигнал на то, что генерирует и прерывает, если это то, что вам нужно.

Вероятно, Mach 3 использует High Performance Event Timer (HPET), который согласно здесь является частью последних наборов микросхем Intel. Таймеры 0 и 1 используются для эмуляции 8254.

«Прерывание таймера 2 ICH HPET может быть направлен к любому из следующих IRQ: 11, 20, 21, 22 и 23 через Регистр TIM2_CONF. (Примечание: это регистр называется TIM3_CONF в Intel® ICH5.) "

9
ответ дан 8 December 2019 в 02:35
поделиться

Для всех респондентов,

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

По-видимому, я неадекватно передал свою точку зрения, поэтому я попробую еще раз. Я хочу создать событие, которое происходит 100, 000 раз за период времени в 1 секунду при стоимости ЦП примерно 12%.

Программа, на которую я ссылался, Mach 3, генерирует частоту 108000, когда пользователь выбрал 100000, но частота очень стабильна. Я упоминаю это, чтобы проиллюстрировать, что точность фактического временного интервала не критична до тех пор, пока ошибка временного интервала постоянна.

Я еще раз упомяну, что Mach 3 работает с затратами ЦП около 12%. Частота 108000 излучается на выводе параллельного порта, где ее можно проверить с помощью осциллографа, что я и сделал.

Другие респонденты в некоторой степени поняли, чего я хотел достичь, но их пример состоял в измерении количества циклов, которые могут возникнуть в период времени в 1 секунду при признании неприемлемости стоимости процессора.

По общему мнению, я м желающих сделать не возможно. Для тех, кто согласен с этим мнением, я бы посоветовал вам поискать в Google Mach 3 CNC , загрузить бесплатную копию программы и затем установить ее. Запустите программу, используйте вкладки, чтобы перейти на страницу диагностики, где вы сможете убедиться, что это действительно возможно. Программа сначала откроется, работая на частоте по умолчанию 25 кГц. Частоту можно изменить, открыв пункт меню «Конфигурация» / «Порты и контакты» /, затем выбрав новую частоту и повторно открыв программу.

На подобных форумах есть большое количество сообщений, относящихся к этой теме и ответы, по большей части, такие же, как и те, что я получил. Я привел пример, который ясно показывает, что это ВОЗМОЖНО, поэтому давайте разберемся, как Mach 3 выполняет эту задачу.

0
ответ дан 8 December 2019 в 02:35
поделиться

Alright, after reading the Mach 3 documentation (which is well-written, informative, and even funny), I think I see what is going on. First, realize that there is a difference between having a user-space event trigger at a high frequency and having a kernel interrupt routine. The kernel interrupt routine must be fast, and thus not contain very much logic, so normally we say that it's impossible to have a generalized call-back in your program that can respond to events at frequencies > 1 kHz. Furthermore, operating systems use the local timers for the schedule, which decides when user programs can run, and typically the scheduler speed is not more than 1 kHz, therefore it's impossible to write a user-space program that responds faster than this.

However, in this case, you don't need to have complex user-space logic responding at that speed, since the goal is only to modulate an output pin at a high frequency in order to produce a PWM signal. It might be feasible to create a kernel interrupt handler for the APIC which has high priority and is triggered at high frequency, if it only does very simple things such as toggling an output pin on the parallel port.

So, if you wish to do this, I suggest you read up on kernel programming and using the APIC, and you might be achieve something useful to you. However, some words of advice:

  • Distributing a driver with your software is a pain in the ass both for you as a developer and for your users who must install a driver which may or may not work. (Hardware is finicky and if your solution depends on very specific computer configurations your mileage may vary.)
  • Having such a high-frequency interrupt running will bog down the computer and make things very hot. You may get stalls or blue screens. Be prepared to deal with this kind of annoyances.
  • If you succeed in toggling an LPT pin in response to an APIC timer, I suggest hooking up an acquisition card or digital oscilloscope to measure not only the frequency, but also the jitter. Any software-timed signal tends to have more jitter, so watch out for this. Jitter effectively increases the noise in your signal. Additionally, jitter tends to remain constant, so at low frequencies it may not be a problem but at high frequencies the jitter may become a large percentage of your total period, significantly decreasing the signal-to-noise ratio.
  • If your goal is really to just produce a PWM or pulse signal to control stepper motors, having a bit of out-board hardware is really the best way. I'll back this up with a few sub-points:
    • Firstly, if you read the Mach 3 docs, they contain a section on how to electrically isolate your computer's parallel port in case of electrical issues. In other words, even if you use the built-in LPT port, some external hardware is recommended anyways just for safety. If you're going to do this, you may as well include a $2 timer chip.
    • Since you are generating a high-frequency signal but only controlling this signal at a lower rate, there is no need to bog down the computer with the task of actually producing the signal itself---this is what timer chips are for.
    • A $5 low-cast AVR microcontroller can talk to the computer over the USB port and generate a PWM signal. This is a far less expensive solution than buying a $100 board, but it depends on your needs. (Like how many signals, etc.) For example, buy a Teensy and just plug it into your computer's USB port, and write a 5-line program to control the 7 provided PWM outputs. Done, and done!
    • If you search online for "PWM parallel", you'll find lots of tutorials on how to generate PWM signals using the parallel port, but notice that 99% of them are actually tutorials on how to control an external timer chip attached to the parallel port, not how to generate the actual PWM signal directly.

Finally, here are some documents you might find useful:

1
ответ дан 8 December 2019 в 02:35
поделиться

Не могли бы вы попробовать использовать что-то вроде IntervalZero's RTX. Это не бесплатно, это коммерческий продукт, он написан для введения в реальном времени в Windows (XP и т.д.) У него есть несколько очень быстрых таймеров. Согласно этой статье RTX имеет таймеры со значением 1 микросекунды (в то время как Windows это 1000 микросекунд)

Не уверен, что pricing\licensing похож на pricing\licensing. Я поболтал с оценочной версией.

0
ответ дан 8 December 2019 в 02:35
поделиться

Звучит так, как будто вам нужен 555 таймер (или кристалл), И ворота и параллельный порт (или цифровое устройство ввода/вывода USB). Вы можете подделать звуковую карту DSP, чтобы сделать что-то подобное, но я бы не стал ставить на это.

Любой таймер, который вы можете построить на окнах, которые будут работать на требуемой скорости, будет привязан к процессору. Дело не в том, что вычислительный процессор не может справиться с этим, но вы должны подумать об остальных движущихся частях вашего компьютера. Получить надежный сигнал 100 кГц от программной эмуляции до аппаратной сигнализации ввода/вывода на стандартном аппаратном обеспечении - задача достаточно сложная. Вы будете связывать ядро только для того, чтобы получить правильный шаблон сигнала.

Несколько вариантов могут заключаться в создании шлейфа обратной связи для последовательного порта, а затем воспроизведении битовых шаблонов и типов сигнализации для получения достаточно стабильного сигнала. Но вы будете гораздо лучше обслуживать либо построить или купить цифровую плату управления, которая сделана для управления станком с ЧПУ. Если вы посмотрите, большинство передач, связанных с этим станком 3 CNC относится к платам управления, которые берут USB, RS-232 или LPT портов.

(О, и говорить людям, что они ошибаются, вместо конструктивного комментария... тоже не выигрывает для вас ни один фанат)

0
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: