zi4rox
Nov 16 2009, 17:09
Есть задача и желание разобраться и освоить работу c TMS320.
Первый заход в поисковики и форумы - выдал примерную картину для меня: "обсуждения каких-то конкретных проблем есть, решения есть - но такое ощущение что все как бы сразу уже умеют работать с ними, а начального уровня нигде не увидел".
Для освоения данных процессоров есть простая
задача: сделать на базе тмс320 цифровой фильтр н-ого порядка. Первый вопрос который сразу же задал себе - чем и как программировать, среда разработки и т.п. Вообще куча вопросов (потому что опыта работы с ними нет вообще, есть большой опыт проектирования девайсов на авр - там то инфы было завались). Надеюсь что поможете добрым словом, и данный тред будет полезен таким же новичкам
1. Среда разработкиНу тут вроде все прозрачно, почти все упоминания сводятся к
Code Composer Studio. Вроде все хорошо тут и на си кодится )
2. ПрограмматорВот здесь у меня оооочень большие вопросы и сомнения. Схем программаторов как таковых не нашел вообще нигде, на форумах у всех есть тестовые-платы которые стоят очень много и заводские программаторы-эмуляторы, которые стоят ещё дороже. Единственное что нашел так это
Olimex TMS320-JTAG программатор-эмулятор + на форуме по нему отзывы тоже разношерстные.
В общем я очень сильно задаюсь вопросом -
как прошивать-то?. Или я действительно оплошался, наивно полагая что заказав сэмпл проца с техаса и спаяв/купив дешевый программатор можно начать работать?
3. Какой проц взять?Из вашего личного опыта - с каким семейством проще начать работу и изучение? Пока склоняюсь, что надо заказывать TMS320FC28xx - исходя только из тех соображений, что именно их можно прошивать бюджетным программатором от Olimeх.
4. Примеры, схемыИ ещё один нюанс который не очень нравиться - почти нет схем, примеров проектов на данных процах. Все юзают отладочные платы, которые мне не под силу достать. Хоть парочку бы простеньких реализаций, посмотреть обвязку, как программить и подключать - хоть что-то. В даташите тоже ооочень скудно.
Так что вот, пока смотрю как на большой черный ящик, у которого приоткрыл крышку - но пока все равно ничего не видно. Но желание осилить это дело есть - прошу добрых людей направить в нужную сторону и помочь добрым постом )
kamil_yaminov
Nov 16 2009, 17:48
1) Если писать алгоритмы ЦОС, то писать на ассемблере
2) Грузить и прошивать можно разными способами, в том числе и через RS232. Софт для этого наверное можно найти на spectrumdigital.com. Про способы загрузки и прошивки есть пдфки на сайте техасцев. Вообще, у них на сайте можно найти много чего полезного. Есть простенький эмулятор XDS100. На сайте техаса выложена схема данного устройства - можно собрать самому, либо купить, благо стоит он 79$. Для начала пойдет.
3) 28хх больше ориентированы на управление двигателями и источниками питания и являются больше МК, чем ЦСП. Если нужно реализовывать алгоритмы ЦОС, то стоит обратить внимание на С5000 и С6000. Хотя в последнее время и среди 28хх появились интересные камни.
4) Куча разных примеров есть на сайте ti.com. На spectrumdigital.com можно найти схемы отладочников.
Но для начала стоит определиться, для каких целей предполагается использовать процессор. Потом выбрать семейство, а дальше будет легче со всем остальным.
UPD. Сечас sigmaN еще подкинет дровишек )
sigmaN
Nov 16 2009, 17:59
http://focus.ti.com/docs/toolsw/folders/pr...dx28027usb.htmlСтоит около 40баксов.
Выглядит как флэшка, там на плате сразу контроллер и эмулятор.
Можно и шить и отлаживать(хотя и медленно, конечно).
Ну самоделок вы не найдете наверное....это ж не АВР всё таки
тут бабки делаются на всём чем можно.
Ну и искать нужно если чисто для C2000 - то цена будет ниже соответственно.
с TMS320 начинается очень много процов.
По С2000 это ИМХО самый дешевый вариант. 40$
Конечно, полноценная отладочная плата от Спектрум Дигитал за 500 баксов это может быть дороговато, но зато там реально БЫСТРЫЙ эмулятор на борту и некоторая переферия имеется....
Т.е. цена конечно завышена, спору нет, но зато это удобно
Купите ezDSP F28335 один раз и сможете много чего попробывать(на много круче, чем просто фильтр)......
Added: эх. Опять опередили, пока мой ADSL переподключался
А чё, в C2000 тоже неплохая DSP цифромельница стоит. Многое можно на ней обкатать. А ежели ещё проц с FPU сразу взять - так и ваще сказка.
Другое дело, что памяти маловато и флэш тормознутая - это ДА
Цитата(zi4rox @ Nov 16 2009, 20:09)
2. Программатор
Вот здесь у меня оооочень большие вопросы и сомнения. Схем программаторов как таковых не нашел вообще нигде
Ну плохо искали. Я довольно давно выкладывал.
http://projects.caxapa.ru/?ID=6 И его суть - внутрисхемный отладчик, а не програмамтор, программировать/грузить можно почти все процы через их разнообразные интерфейсы, SPI, UART, USB, I2C, у кого что есть. Кстати, сейчас в принципе возможно убрать из схемы ACT8990, у меня уже есть решение для размещения внутри ПЛИС, но нет стимула возиться.
Цитата(zi4rox @ Nov 16 2009, 20:09)
3. Какой проц взять?
Из вашего личного опыта - с каким семейством проще начать работу и изучение? Пока склоняюсь, что надо заказывать TMS320FC28xx - исходя только из тех соображений, что именно их можно прошивать бюджетным программатором от Olimeх.
Возьмите TMS320VC5509 или 5507. Их можно грузить просто через их же USB без каких либо программаторов. И для запуска ему достаточно питания и кварца 12-мгц-ового. Для старта самое то. А на 28хх пересядете если что легко.
Цитата(kamil yaminov @ Nov 16 2009, 20:48)
1) Если писать алгоритмы ЦОС, то писать на ассемблере
Ага, особенно под 6000-ки
Крышу на раз сносит!
Fedor_spb-2
Nov 17 2009, 08:50
Да не обидится на меня zi4rox создавший тему. У меня аналогичная ситуация со знаниями по этому DSP, но вопрос другой: как считать память из флэш? Уж и чем только не пробовал, везде erase, program, verify есть, а read нет. Почему? И как это можно сделать? В наличии TMS320F2811, XDS510, CCS4, SDFlash, SDConfig. Спасибо.
Цитата(Fedor_spb-2 @ Nov 17 2009, 11:50)
как считать память из флэш?
Оригинальная формулировка... Как считать память из памяти.
В CCS3 это было Tools->Memory Save/Load utility.
Fedor_spb-2
Nov 17 2009, 09:39
Да да. Сам перечитал, улыбнулся, но, подумал, ведь профи-то меня поймут.
В CCS4 есть Tools->On-Chip Flash. Раскрывается закладка, а там Erase, Program, Verify. Чуть ниже Program, Verify и еще ниже Load RAM only. И все.
Цитата(Fedor_spb-2 @ Nov 17 2009, 12:39)
В CCS4 есть Tools->On-Chip Flash.
Да причем тут флеш? Там совсем другой тул, который просто сохраянет кусок адресного пространства проца, флеш там или нет, внутренняя или внешняя, в файл. Это не во флеш-тулзах. Четвертого композера у меня сейчас нет под рукой, а где в третьем - я же конкретно указал.
Fedor_spb-2
Nov 17 2009, 11:04
Уррря. Нашел. View->Memory, откроется окно, а тум уж правой мышкой выбрать. Казалось бы просто, но с наскока не видел пока с каждой кнопочкой не разобрался. Собственно, задавал вопрос только для того, чтобы вдруг не искать долго и нудно то, чего нет и не предусмотрено. Когда сказали есть, стал искать. Спасибо за помощь.
zi4rox
Nov 18 2009, 14:00
Начальный курс понял - закажу процы, проштудирую дш, и буду уже ручками пробывать. Тогда уже конкретные вопросы будут. спасибо
Цитата(kamil yaminov @ Nov 16 2009, 20:48)
1) Если писать алгоритмы ЦОС, то писать на ассемблере
Голословно.
Цитата(qxov @ Dec 10 2009, 13:48)
Голословно.
Зато эффективно. Целые немаленькие фирмы трудятся над оптимизацией ЦОС-алгоритмов на ассемблерном уровне и живут этим. Даже с 6000-ками, где асм-программирование трудно и геморройно, оно нередко себя оправдывает на ЦОС-алгоритмах.
segnetik
Jan 9 2010, 14:28
Добрый день! С TMS320VC5507 при загрузке через USB возникла следующая проблема - процессор не определяется компом. Для загрузки, следуя инструкциям из мануала, выполняю следующие шаги :
1. Включаю питание
2. Перевожу проц в режим загрузки с USB
3. Делаю сброс проца
после сброса никаких эмоций... если линии данных USB подтянуть к 3.3В ( D- через 1.5К, D+ через 1М резисторы), то появляется неизвестное устройство с пустыми вид и пид, что естественно ни о чем не говорит... Уровни напряжений на линиях данных - 0,5 на D- и 0 D+
USBVdd = Vdd = 3,33В. CVdd = 1,26В. кварцевый резонатор стоит на 12 МГц.
соответственно, возникло несколько вопросов :
1. +5В от USB не подключено никуда?
2. PU ( через 1,5К подключено к D+, по даташиту ) должно быть внутри проца соединено с 3,3В, однако даже при отключенном шнуре USB, на данном пине этими 3,3 В и не пахнет... Каюк USB модулю в проце?
P.S. Отсутствие КЗ или непропаев исключено - проверял множество раз уже...
Alex11
Jan 10 2010, 08:24
Вроде бы все правильно. Проверьте, действительно ли Вы поставили его в режим загрузки с USB. Там легко можно попутать выводы. Проверьте фронт сигнала Reset. Если он пологий - проц может просто не запускаться.
А еще проверьте, чтобы на EMU0 и EMU1 было по единице. А то процессор просто может оказаться в состоянии "OFF" когда все его пины в третьем состоянии.
bullit
Jan 11 2010, 17:35
Всем добрый день!
Вот смотрю в сторону TMS320F28234 и понять не могу по поводу частоты переключения "ног".
Может кто нить пояснить?
Вот в
даташите написанно мол скорость на выход макс 25 МГц, а на вход? там чёт такое написанно, а разобраться не могу...
Если кому не трудно, поясните пжлст.
Дело в том что хочу ентот камень на ацп 20MSPS подключить. Вот думаю буду ли я успевать читать с портов? Или может какой другой камень лучше подойдёт?
Yura_K
Jan 15 2010, 21:03
1) Обычно у таких АЦП LVDS выходы, а у DSP'ков вроде как нет LVDS интерфейсов.
2) Для работы со скоростными интерфейсами лучше применить ПЛИС, возможно даже FPGA (в них и поддержка LVDS имеется).
3) В даташите пишут: If QUALPRD = 00, then the sampling period is 1 SYSCLKOUT cycle, т.е. при отключении входного "фильтра", частота опроса равна 150 МГц.
Alex11
Jan 16 2010, 11:45
Если Вам нужно взять, скажем 1000 отсчетов, затем пауза для обработки, а затем снова - тогда еще шанс есть, хотя и невеликий. А если в непрерыве и с обработкой - то не успеете.
bullit
Jan 16 2010, 12:14
1) У данной АЦП обычный паралельный интерфейс. Вот уже у 40МГц-овых LVDS стоит.
2) с ПЛИСами не знаком, к сожелению. Времени освоить боюсь больше нужно будет.
3) тогда это меняет дело. Но выход выше 25 достичь нереально?
А то ведь еще операции (чтение порта, запись в внутр. озу, счётчик измерений проверять) делать надо.
Мне 2000-3000 точек максимум всего. А потом пульнуть по SPI, но не всё, а тока кусочек (выбирается из сигнала некоторый кусочек). Задача у мк всего-то принять, найти кусок сигнала где он меняется (по уровню сигнала) и несколько точек передать.
segnetik
Jan 20 2010, 12:36
Добрый день! Получилось завести железяку tms320vc5507, определятся через USB, грузится и через SPI EEPROM и через USB.
Возник вопрос по программированию - как выставлять данные на линии D0-D15 (как при использовании EMIF, так и при HPI)? насколько я понял - регистры связанные с данными интерфейсами содержат только флаги управления и состояния. В CSL обнаружил функции только для конфигурирования (( Подскажите пожалуйста.
Цитата(segnetik @ Jan 20 2010, 15:36)
Возник вопрос по программированию - как выставлять данные на линии D0-D15 (как при использовании EMIF, так и при HPI)?
При EMIF - просто записью или чтением по адресам адресного пространства процессора, соответствующим нужному CEx емифа. При HPI - никак. HPI работает наоборот - обеспечивает доступ к памяти процессора со стороны другого внешнего устройства, выступающего в роли мастера.
segnetik
Jan 20 2010, 12:57
Спасибо!
kamil_yaminov
Jan 22 2010, 15:10
А может тему того? Подвесить сверху?
segnetik
Jan 23 2010, 01:22
Возник новый вопрос по TMS320VC5507/09A
Существует ли возможность однократного вывода данных на линии D0-D15? Другими словами мне необходимо на данные линии в произвольные моменты времени выводить некоторые данные. Возможно ли это реализовать и если да то как лучше?
aaarrr
Jan 23 2010, 03:36
И что подразумевается под "однократным выводом"? Пишете по нужному адресу, EMIF на шине ставит данные - дергает стробы. Или же вы хотите устанавливать линии D0-D15 на манер GPIO?
segnetik
Jan 23 2010, 09:42
Грубо говоря - да, на манер GPIO. Ведь когда данные выводишь через EMIF, он начинает последовательно перебирать содержимое отведенной памяти. Что данные линии (Д0-Д15) линиями GPIO не являются я знаю, но возможно существует какой-либо фокус с конфигами EMIF или с использованием однократного DMA DARAM -> EMIF, чтобы их можно было использовать как таковые?
Сигналы данных и управления так использовать не представляется возможным. А вот сигналы шины адреса - A15...A0 - можно, переключив режим в регистре EBSR на DATA EMIF или MULTIPLEXED HPI.
Цитата
Ведь когда данные выводишь через EMIF, он начинает последовательно перебирать содержимое отведенной памяти
Извините, но это какой-то бред. EMIF сам никогда и ничего перебирать не начинает. Сделали один вывод в адресное пространство, соответствующее EMIF-у, он, EMIF, сгенерировал один цикл доступа в внешнюю память. А вот останется ли после этого цикла линия данных в том состоянии, в котором была во время цикла - смотрите осциллографом. Возможно и останется, там есть bus holder-ы. А возможно и нет... Никто не обещает.
Andron_
Jan 24 2010, 06:31
bus-holder'ы есть на шине данных... но штука специфичная, для GPIO плохо подходит... триггер басхолдера запросто опрокидывается емкостью щупа осциллографа...
aaarrr
Jan 24 2010, 06:53
А простую защелку(-и) типа 16374/374 подцепить никак нельзя?
Цитата(aaarrr @ Jan 24 2010, 09:53)
А простую защелку
Как правило плату сначала разводят и изготавливают, а потом начинают думать, как теперь что сделать
segnetik
Jan 24 2010, 11:52
Поначалу разбирался с tms320vc5502, там половину линий данных можно под пользовательские нужды задействовать, потому никак не мог предположить что такая засада может быть
Хранители действительно как-то странно работают здесь... В итоге решил оставить в покое эти Д0-Д15 и использовать преобразователь I2C -> параллельные 8/16 бит. Для поставленной задачи производительности I2C за глаза. Спасибо всем за ответы!!!
Цитата(segnetik @ Jan 24 2010, 14:52)
Поначалу разбирался с tms320vc5502,
так 5501/2 сделали значительно позже, чем 5509 (5507 это он же, но кастрированный). В нем, 5501/2, видимо и сделали GPIO на данных по пожеланию недовольных от 5509
kamil_yaminov
Jan 28 2010, 11:43
Спрошу и я. Никак не могу сообразить как заинлайнить функцию. Процессор F2809.
В хидере пишу вот такое:
Код
inline void CanWrite(Uint16 CHAN_NUMBER, TCAN_DATA *DATA);
В сишном файле вот такое:
Код
inline void CanWrite(Uint16 CHAN_NUMBER, TCAN_DATA *DATA)
{
//тут код, который запихивает данные в дата-регистры меэйлбокса
}
Компилятор, соответственно ругается матом, говорит, что function "CanWrite" was declared but never referenced. Что почитать? Керниган и Ритчи по этому поводу молчат. Понимаю, что K&R C не самой последней свежести, хочется поднять свой уровень с быдлокодерства чутка повыше ).
PS. Товарищам модерам: может данную тему закрепить как важную сверху, чтобы тут те кто присматривается/начинает спрашивали/читали, дабы каждый раз не плодить новую тему?
aaarrr
Jan 28 2010, 11:53
Так в чем проблема? Если функция "never referenced", так стало быть и некуда ее инлайнить.
kamil_yaminov
Jan 28 2010, 12:09
Да вроде используется она, в другом месте: есть сишный файлик с основным циклом, там делаю:
Код
#include "CAN.h"
.......
CanWrite(AnswerTx, &TxData);
.......
CAN.h - это там, где объявлена функция CanWrite
aaarrr
Jan 28 2010, 12:14
Цитата(kamil yaminov @ Jan 28 2010, 15:09)
Да вроде используется она, в другом месте
В другом месте компилятор ее, естественно, не видит: тела-то нет, оно закопано в другом C-файле, о котором компилятор не имеет ни малейшего понятия.
kamil_yaminov
Jan 28 2010, 12:20
Так, когда я убираю из описания функции ключевое слово inline, то все работает.
aaarrr
Jan 28 2010, 12:26
Конечно - тогда это забота линкера, который в курсе всего.
Чтобы использовать инлайн функцию, нужно ее разместить так, чтобы компилятор ее видел, т.е. или в самом модуле, или в подключаемом хидере.
Andron_
Jan 28 2010, 13:28
тело inline-функций должно размещаться в месте объявления.
вот это все должно быть написано в хедэре:
Код
inline void CanWrite(Uint16 CHAN_NUMBER, TCAN_DATA *DATA)
{
//тут код, который запихивает данные в дата-регистры меэйлбокса
}
дядька Страуструп об этом писал английским по белому.
kamil_yaminov
Jan 28 2010, 13:41
Спасибо!! Теперь ясно. Надо попробоватьУже запробовал - работает. Признаю, про линкер ступил, мог бы и додуматься сам )
C-r-o-w
Oct 17 2010, 12:35
Ребят, очень надеюсь, что тема не умерла. Прошу помощи по TMS320VC5506. Где можно посмотреть любой готовый проект на данном (или хотя бы из серии C55xx) процессоре? Интересует банальный запуск сего камня с загрузкой через USB, т.е. что и как нужно в нем запитать (в частности, питание 1.2 вольта относится ТОЛЬКО к ядру и модулю USBPLL? т.е. управление всеми логическими уровнями (в т.ч. GPIO для выбора boot-loader'а) производится с помощью +3.3 В? какие еще выводы (кроме RESET и вышеупомянутых EMU0,1) нужно повесить на "1" (или "0"))?
Частичный перевод даташита на tms320f2808. На "ляпы" перевода не ругайтесь ), не профи в этом, там где стоят символы ???? не уверен в правильности, вставлял для того чтобы вернутся к этим фрагментам позже - искать проще. Переводил для себя, - английский немного подучить, да и на русском проще воспринимается. Не закончил потому что больше нет необходимости в этом. Может и понадобится кому.
Racurs
Oct 19 2010, 06:29
Возникла проблема при программировании CAN в TMS320F2812. Решил руководствуясь даташитом настроить CAN и отправить данные -- отправка в шину не идёт. Скачал пример sprc097 ecan_back2back, изменил в нём бит STM=0 -- тот же результат. Может кто-нибудь сталкивался с программированием CAN и есть рабочие проекты, как увидеть хоть что-нибудь на выходе? И ещё вопрос: необходимо ли подключать на шину хотябы одно устройство CAN чтобы пошла передача от модуля CAN в TMS?
argentum
Jan 20 2011, 19:44
Цитата(Fedor_spb-2 @ Nov 17 2009, 14:04)
Уррря. Нашел. View->Memory, откроется окно, а тум уж правой мышкой выбрать. Казалось бы просто, но с наскока не видел пока с каждой кнопочкой не разобрался. Собственно, задавал вопрос только для того, чтобы вдруг не искать долго и нудно то, чего нет и не предусмотрено. Когда сказали есть, стал искать. Спасибо за помощь.
Уважаемый Fedor_spb-2, подскажите, как вам удалось скачать программу из памяти?
У меня в указаном окне все элементы неактивны!
Spinch
Nov 21 2011, 12:31
Ломаю прошивку для TMS320C28xx под Code Composer Studio.
Прошивка мне досталась "в наследство" от ушедшего сотрудника.
Суть проблемы: На данный момент отведено под прошивку только три сектора памяти, а сама прошивка вылезла за пределы. Необходимо подцепить четвёртый сектор. Кто может внятно рассказать где и как это сделать?
Заранее спасибо.
Цитата(Spinch @ Nov 21 2011, 15:31)
Ломаю прошивку для TMS320C28xx под Code Composer Studio.
Прошивка мне досталась "в наследство" от ушедшего сотрудника.
Суть проблемы: На данный момент отведено под прошивку только три сектора памяти, а сама прошивка вылезла за пределы. Необходимо подцепить четвёртый сектор. Кто может внятно рассказать где и как это сделать?
Заранее спасибо.
У Вас исходники есть или нет?
Spinch
Nov 21 2011, 13:06
Цитата(Matic @ Nov 21 2011, 15:39)
У Вас исходники есть или нет?
Исходники в полном объёме. Их и дорабатываю. Правда пока не постиг полного дзена приходится консультироваться у гуру
Нашел файл f2812.cmd
Вроде интересубщее место тут:
Код
SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHB PAGE = 0
.pinit : > FLASHB, PAGE = 0
.text : > FLASHC PAGE = 0
codestart : > BEGIN PAGE = 0
ramfuncs : LOAD = FLASHC,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
csmpasswds : > CSM_PWL PAGE = 0
csm_rsvd : > CSM_RSVD PAGE = 0
собственно текст ошибки:
Код
<Linking>
>> error: can't allocate ramfuncs, size 00000360 (page 0) in FLASHC (avail:
00000331)
>> error: errors in input - ./Debug/iss.out not built
>> Compilation failure
----------------------------------------------------------------------------------------------
UPD:
Всем спасибо, что выслушали. Внимательное прочтение всоего же сообщения выявило подсказку sm.gif
Вроде всё заработало после переноса ramfuncs в сектор D
Andron77
Dec 14 2011, 07:47
Всем доброго времени суток.
Осваиваю TMS320F2808 всего пару недель, есть несколько вопросов по тактам и по реализации точных временных задержек.
ЦСП установлен на планке, заводском контрольном модуле под DIMM100, отладочной плате кто-то приделал ноги, поэтому сделал свою, программирование и отладка в CCS4.1.3 через XDS100V2 USB JTAG, DSP/BIOSа нету.
Тестовая небольшая программка моргает парой светодиодов в разных режимах. В ней реализована обычная программная задержка, прерывания все отключены. Частота кварца 20МГц, SYSCLKOUT проца 10МГц, выход внешнего такта 10/4=2.5МГЦ (точно измерено), то есть все по умолчанию.
В автономке JTAG отключен, общая программа записана во флэш (конвейер отключен), но подпрограмма задержки при инициализации копируется один раз в RAM L0 и там выполняется все время (проверено дизассемблером).
Подпрограмка задержки на С простая.
------------------------------------------------
void delay_loop(Uint32 tmp)
{
do{
tmp--;}
while (tmp>0);
}
-----------------------------------------------
Соответствующий asm дизассемблера, цикл который крутится, от него в основном и зависит длительность задержки
отрабатывает за 7 тактов, то есть по идеи за 0.7мкс на 10_МГц, цикл крутится 428571 раз (расчет 0.3сек)
m1: movb acc,#1 (1 такт)
subl *-sp[2],acc (1 такт)
movl acc,*-sp[2] (1 такт)
sbf m1, NEQ (4 такта)
Но реально измеренная задержка больше расчетной на 30%, 0.4с вместо 0.3с. Почему?
Выходит, что доступ к RAM L0 работает с циклами ожидания? хотя в даташите написано 0-wait?
Либо какая-то команда выполняется больше, чем 1 такт?
Вы где эти задержки меряете? На GPIO? Ну тогда это у вас задержка GPIO. Ну не предназначен он для таких временных интервалов.
Если уж пишете о %, то элементарно проверьте на больших величинах задержки. Если ошибка не пропорциональна величине задержки,
а является константой - это явно из-за частоты работы GPIO.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.