Перейти к содержанию

Вопросы По Coocox Coide


mr_smit

Рекомендуемые сообщения

Добрый день. Использую отладочную плату discovery. Подключил по SPI дисплей от Siemens S65. Всё работает, но не могу понять как работать со sprintf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел: http://www.coocox.or...ae-001d7d723e56

Кокосовцы в курсе и предлагают прикрепить к проекту доп. файлик. Прикрепил. Всё стало компилироваться. Но sprintf не работает. Может кто прояснит ситуацию.

char convert[32];
float temp = 23.9;
...
put_string(50,22,"ТЕМПЕРАТУРА",0x0000,2);

sprintf(convert,"%.1f",temp);
put_string(50,50,convert,0x0000,2);

Слово "температура" выводится, а само значение нет.

Посмотрел их измененный файл. У них там написано:

signed int sprintf(char *pStr, const char *pFormat, ...)

Что значит троеточие??? И где форматирование точка с запятой ' f ' ?

/* Parse type */
switch (*pFormat) {
case 'd':
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
default:
return EOF;
}

Думал modf использовать, но эта функция всё равно дробную часть в виде точки с запятой выдает. Умножение на 10 не помогает. Как тогда число с плавающей точкой перевести в строку то? :wall:

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Попробуйте так:

sprintf(convert,"%f",temp);

Троеточия подразумевают бесконечное число параметров. Т.е. можно не только одну но и более переменных выводить одной командой в один буфер, кроме вывод тут можно сделать сразу всего, например sprintf(convert,"Температура = %f",temp);

* так работает в классическом Си, не знаю как с микроконтроллерами.

** судя по тому, что f не прописан, оно скорее всего и не заработает

Изменено пользователем tcoder
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Попробуйте так:

sprintf(convert,"%f",temp);

** судя по тому, что f не прописан, оно скорее всего и не заработает

Так оно и не работает. Я пробовал. Дурдом какой то :(

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А если разбить float на два целых числа и вывести их через точку ?

Можно и так (кстати как?). Но всё же почему нет стандартной функции :(

Ссылка на комментарий
Поделиться на другие сайты

Может кто знает лучший вариант... я делал так:

float pi = 3.14;
int pi_int = pi; //здесь будет целая часть - 3
int pi_float = ((pi*100)-(pi_int*100)); //здесь будет дробная часть - 14

Если в дробной части нужна точность до тысячных, то ((pi*1000)-(pi_int*1000)) и т.д...

Далее просто выводим pi_int и pi_float через точку и получим 3.14

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

Служба поддержки кокоса молчит. Так жаль. Мне понравился этот компилятор. А ля кодевижн для Мег.

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

Я вообще не понимаю что за `_sbrk_r' `_lseek' `_kill' `__exidx_start' ему нужны

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-sbrkr.o): In function `_sbrk_r':

[cc] writer.c:(.text+0x10): undefined reference to `_write'

[cc] sbrkr.c:(.text+0xc): undefined reference to `_sbrk'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-writer.o): In function `_write_r':

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-closer.o): In function `_close_r':

[cc] closer.c:(.text+0xc): undefined reference to `_close'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-lseekr.o): In function `_lseek_r':

[cc] lseekr.c:(.text+0x10): undefined reference to `_lseek'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-readr.o): In function `_read_r':

[cc] readr.c:(.text+0x10): undefined reference to `_read'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/armv7-m\libgcc.a(unwind-arm.o): In function `get_eit_entry':

[cc] unwind-arm.c:(.text+0x144): undefined reference to `__exidx_start'

[cc] unwind-arm.c:(.text+0x148): undefined reference to `__exidx_end'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-abort.o): In function `abort':

[cc] abort.c:(.text+0xa): undefined reference to `_exit'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_kill_r':

[cc] signalr.c:(.text+0xe): undefined reference to `_kill'

[cc] c:/program files/arm-none-eabi-gcc-4_6/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib/armv7-m\libg.a(lib_a-signalr.o): In function `_getpid_r':

[cc] signalr.c:(.text+0x28): undefined reference to `_getpid'

[cc] collect2: ld returned 1 exit status

BUILD FAILED

Total time: 1 second

Ссылка на комментарий
Поделиться на другие сайты

Ответ с кокосового форума:

//do the following:


float float1;
snprintf(buf, sizeof(buf), "blablabla %d.%d", (int8_t) float1, (((int16_t)(float1 * 10.0)) % 10));

Изменено пользователем mr_smit
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

При отладке проекта в CoIDE 1.6.0 в вкладке Variables, переменные выводятся по умолчанию в DEC формате, каждый раз приходится переключать на HEX. Нигде не могу найти настройки, чтобы все время выводилось по умолчанию в шестнадцатеричном формате.

Ссылка на комментарий
Поделиться на другие сайты

  • 11 месяцев спустя...

Здравствуйте. Все наверно сталкивались с возможностью автозамены кода. (К примеру вывод конструкции if-else когда начинаешь набирать if). Но вид в котором выстраиваются скобки совершенно не устраивает. Может кто знает, где это можно изменить?

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...

Добрый день. Использую отладочную плату discovery. Подключил по SPI дисплей от Siemens S65. Всё работает, но не могу понять как работать со sprintf в CooCox ??? В чистом виде не компилируется. Показывает не понятные ошибки привязанные к ядру. Погуглил, нашел: http://www.coocox.or...ae-001d7d723e56

Кокосовцы в курсе и предлагают прикрепить к проекту доп. файлик. Прикрепил. Всё стало компилироваться. Но sprintf не работает. Может кто прояснит ситуацию.

char convert[32];
float temp = 23.9;
...
put_string(50,22,"ТЕМПЕРАТУРА",0x0000,2);

sprintf(convert,"%.1f",temp);
put_string(50,50,convert,0x0000,2);

Слово "температура" выводится, а само значение нет.

Посмотрел их измененный файл. У них там написано:

signed int sprintf(char *pStr, const char *pFormat, ...)

Что значит троеточие??? И где форматирование точка с запятой ' f ' ?

/* Parse type */
switch (*pFormat) {
case 'd':
case 'i': num = PutSignedInt(pStr, fill, width, va_arg(ap, signed int)); break;
case 'u': num = PutUnsignedInt(pStr, fill, width, va_arg(ap, unsigned int)); break;
case 'x': num = PutHexa(pStr, fill, width, 0, va_arg(ap, unsigned int)); break;
case 'X': num = PutHexa(pStr, fill, width, 1, va_arg(ap, unsigned int)); break;
case 's': num = PutString(pStr, va_arg(ap, char *)); break;
case 'c': num = PutChar(pStr, va_arg(ap, unsigned int)); break;
default:
return EOF;
}

Думал modf использовать, но эта функция всё равно дробную часть в виде точки с запятой выдает. Умножение на 10 не помогает. Как тогда число с плавающей точкой перевести в строку то? :wall:

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

Ссылка на комментарий
Поделиться на другие сайты

Можешь рассказать, что за файлик, и как его подключить?

На стартовой странице кокоса где галочками выбираются используемые библиотеки надо поставить глочку "retarget printf". Сейчас вроде поправили эту библиотеку и всё работает корректно.

Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

я подключил так

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

а потом сделал так

void PrintTarget(uint32_t Value, char *End)
{
char str_buf_V[8];
char str_buf[8];

sprintf(str_buf_V, "%04u%s", Value, End);
str_buf[0] = str_buf_V[0];
str_buf[1] = str_buf_V[1];
str_buf[2] = 0x2E;
str_buf[3] = str_buf_V[2];
str_buf[4] = str_buf_V[3];
str_buf[5] = str_buf_V[4];
str_buf[6] = str_buf_V[5];
MT_WH1602_SetDDRAMAddress(0x0A);
while (MT_WH1602_ReadBusy()!=FALSE);
lcd_write_str(str_buf);
}

в реализации тупо, но на деле работает )

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

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

когда я почитал реализацию sprintf, то понял, что лучше вручную

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Всем привет. Нахожусь на стадии изучения этого камня параллельно языка C, возникают вопросы на которые ищу ответ среди вас.

Решил включить диодики на плате STM32VLDISCOVERY c STM32F100RB.

void main()
{
 //Enable port C clocking
 *(unsigned long*)(0x40021018) |= 0x10;
 /*0x40021000 - адрес регистра AHB, 0x018 - добавка для APB2, 0x10 значение для IOPCEN
 */
 //little delay for GPIOC get ready
 volatile unsigned long i=0;
 i++; i++; i++;
 i=0;
 //режим работы C 8
 *(unsigned long*)(0x40011004) |= 0x10;
 /* 0x40011000 адрес GPIOC , 0x04 - адрес CRH , 0x10 - значение для 8 пина пуш-пул, 2 МГц
 */
 //Turn LED ON!
 *(unsigned long*)(0x40011010) = 0x100;
 /* 0x40011000 адрес GPIOC , 0x10 - адрес BSRR, 0x100 - значение для 8 пина
 */
 while(1);
}

К сожалению диоды не горят. Все мои попытки как-то запустить сей процесс не помогли.

Есть ли здесь ошибка?

Информацию брал с сайта STM, и хабра .

Этот камень для меня первый.

Буду благодарен за вашу помощь.

Ссылка на комментарий
Поделиться на другие сайты

вот ты извращенец

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

GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
// GPIO A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// GPIO B
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO C
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);

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

лучше сразу привыкнуть к нормальной записи и ей пользоваться. Тем более в кокосе великолепнейшая справка по всем функциям и библиотекам со встроенными примерами

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

mail_robot, спасибо за ответ.

Но, хотелось бы, для общего развития и понимания работы данного девайса действовать через регистры.

К сожалению, смотря в библиотеки к стмке, я так и непонял как они, там, работают, поэтому пришлось заниматься сочинительством.

Буду рад участию всех кто понял эту вундервафлю.

Изменено пользователем atrel
Ссылка на комментарий
Поделиться на другие сайты

в стм НЕ надо через регистры. Это совсем другой класс процессора. И адреса в нем знать совершенно не обязательно. Модель программирования отличается от AVR и PIC. Там ресурсов немного, регистры - по пальцам. А тут их просто море, на каждый чих по флагу, на каждый пук свой регистр. На каждое действие куча перекрестных взаимодействий. Если вы будете продолжать в том же духе, думаю знакомство с стм будет весьма мрачным

И кстати не стоит шибко экономить ресурсы и ужимать код. Тут это уже не требуется. Нет, соблюдать правила писанины конечно надо, но не настолько жестко. Производительности по сравнению с 8-битками просто пипец как много...

В целом понять нужно немного.

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

2. В СТМ все просто, не надо усложнять наследием прошлого.

3. Все надо писать понятным языком библиотеки CMSIS

4. Писать лучше на С++. Процедурный код уже не пойдет на такие обьемы. Поэтому начать лучше с кокоса, но потом все равно пересаживаться на Keil

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Вам Не надо. А Мне Интерестно!

Поэтому я и ищу соучастников.

К стати, работаю я в кокосе. Может он неможет так? (ошибок при компиляции не выдаёт).

Изменено пользователем atrel
Ссылка на комментарий
Поделиться на другие сайты

Короче, работает так

void main()
{
 //Enable port C clocking
 *(unsigned long*)(0x40021018) |= 0x10;
 /*0x40021000 - адрес регистра AHB, 0x018 - добавка для APB2, 0x10 значение для IOPCEN
 */
 //little delay for GPIOC get ready
 volatile unsigned long i=0;
 i++; i++; i++;
 i=0;
 //режим работы C 8
  *(unsigned long*)(0x40011004) = 0x02;
 /* 0x40011000 адрес GPIOC , 0x04 - адрес CRH , 0x10 - значение для 8 пина пуш-пул, 2 МГц
 */
 //Turn LED ON!
  //*(unsigned long*)(0x4001100c) = 0xffff;
  *(unsigned long*)(0x40011010) = 0x100;
 /* 0x40011000 адрес GPIOC , 0x10 - адрес BSRR, 0x100 - значение для 8 пина
 */
 while(1);
}

Всё дело было в неправильном значении в CRH и просто = вместо |=.

Ссылка на комментарий
Поделиться на другие сайты

Теперь, вопрос стоит об атомарных операциях.

1. Как их делать?

2. Их преимущество?

3. Почему во многих источниках говорится об группах битов, а не единицах?

Всегда рад Вашему участию.

Ссылка на комментарий
Поделиться на другие сайты

почитайте на тему битовых массивов. Там достаточно много инструментов описано. Но честно говоря смысла в этом не много. Экономии на грош, а потери времени на кодинг существенные. Тем более что С++11 вроде как умеет это дело автоматически оптимизировать даже если и не объявлять битовых структур (по непроверенным слухам). GCC таким свойством не владеет, но зато более толерантен к другим моментам, поэтому код из GCC далеко не всегда прямо переносится на С++11

В остальном битовые операции те же самые что и в восьмибитках (если речь идет о битовом доступе к регистрам и переменным). Синтаксис языка тот же самый

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
  • Похожий контент

×
×
  • Создать...