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

adnega

Свой
  • Постов

    3 594
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Сообщения, опубликованные adnega


  1. Как правильно записать, чтобы компилятор понял, что я от него хочу?

    В gcc делаю так:

    //-----------------------------------------------------------------------------
    //	typedef struct sPARAM
    //-----------------------------------------------------------------------------
    typedef struct sPARAM
    {
    int	delta;
    DWORD	act_datetime;
    
    BYTE	park_mask;
    BYTE	wait_on;
    BYTE	wait_period;
    BYTE	pre_on;
    
    BYTE	pre_period;
    BYTE	fin_on;
    BYTE	fin_period;
    BYTE	to_pre;
    
    BYTE	to_fin;
    BYTE	to_done;
    BYTE	l_pre;
    BYTE	l_fin;
    
    BYTE	to_btn_press;
    BYTE	to_btn_release;
    
    union
    {
    	DWORD	flags;
    	struct
    	{
    		union
    		{
    			WORD	ev_msk;
    			struct
    			{
    				WORD	ev_msk_total:1;
    				WORD	ev_msk_restart:1;
    				WORD	ev_msk_power_fail:1;
    				WORD	ev_msk_enter:1;
    				WORD	ev_msk_start:1;
    				WORD	ev_msk_release:1;
    				WORD	ev_msk_enable:1;
    				WORD	ev_msk_disable:1;
    				WORD	ev_msk_reserv:8;
    			};
    		};
    
    		WORD	btn_inv:1;
    		WORD	box_led_inv:1;
    		WORD	flags_reserv:14;
    	};
    };
    
    } sPARAM;
    
    //-----------------------------------------------------------------------------
    //	const sPARAM param_default
    //-----------------------------------------------------------------------------
    const sPARAM param_default =
    {
    delta:			0, // delta
    act_datetime:		ACT_ALWAYS,// ACT_NEVER,
    park_mask:		0,
    wait_on:		RED_TIME(0.2),
    wait_period:		RED_TIME(3.0),
    pre_on:			RED_TIME(0.2),
    pre_period:		RED_TIME(0.5),
    fin_on:			RED_TIME(1.0),
    fin_period:		RED_TIME(1.0),
    to_pre:			TO_TIME(1.0),
    to_fin:			TO_TIME(10.0),
    to_done:		TO_TIME(2.0),
    l_pre:			DISTANCE(1.0),
    l_fin:			DISTANCE(0.4),
    to_btn_press:		TO_BTN(1.0),
    to_btn_release:		TO_BTN(1.0),
    ev_msk:			0,
    btn_inv:		0,
    box_led_inv:		0,
    };
    

  2. Добрый день, уважаемые форумчане.

    Купил плату STM32F4DISCOVERY

     

    Установил Keil uVision4, написал helloworld в виде мигания светодиодами, получил hex файл(осталось только прошить), для этого скачал драйвер st-link usb driver v.2 и тут полный провал: драйвер вроде устанавливается, однако комп начинает искать драйвер, я указываю путь туда куда он сам должен был установиться(путь он сам указывал), в итоге этого драйвера там не обнаруживается. удалил драйвер, перезагрузил комп, заново поставил - теперь вообще плату не видит. виртуальные порты отключены. Помогите кто сталкивался с подобной проблемой, может это как то связано с вистой, уже 3 дня убил на это. в гугле ничего адекватного не нашел

    Как-то на поведение влияет уровень прав в системе, антивирус и эмуляторы дисков...

  3. Экономия места на плате. Прицепить внешнюю физику конечно не проблема. Например ksz8041rnl ( корпус 32 MLF) в габаритах всего 5мм*5мм. Но иногда и такую площадь выкроить трудно.

    А KSZ8021/8031 и того меньше: 24 ноги в корпусе 4 * 4 мм.

    Плюс фичи: встроенные резисторы-терминаторы, проверка статуса линии с измерением расстояния до проблемного места и т.п.

  4. Ввод цифр от 0 до 9 при помощи энкодера (по типу сейфового замка: "5 по часовой, 3 против часовой").

    Может, идея Вам поможет.

    pos = TIM3->CNT; // считываем положение энкодера
    
    if((pos > (encoder_position + (1<<ENCODER_SENCE) - 1))
    	&&((pos - encoder_position)<((ENCODER_MAX<<ENCODER_SENCE)>>1)))
    {
    	//pos
    	if(enc_dir == -1)
    	{
    		#ifdef ENCODER_DEBUG
    			tx0_push('#');
    			tx0_push(' ');
    		#endif //ENCODER_DEBUG
    
    		tx0_dec(enc_num);
    
    		#ifdef ENCODER_DEBUG
    			tx0_push(' ');
    			tx0_push('#');
    		#endif //ENCODER_DEBUG
    
    		tx0_start();
    		enc_num = 0;
    	}
    	enc_time = 0;
    	enc_dir = 1;
    
    	enc_num += (pos - encoder_position)>>ENCODER_SENCE;
    
    	if(enc_num >= 10)
    	{
    		enc_num = 0;
    	}
    
    	#ifdef ENCODER_DEBUG
    		tx0_push('[');
    		tx0_dec(enc_num);
    		tx0_push(']');
    		tx0_start();
    	#endif //ENCODER_DEBUG
    
    	encoder_position = pos;
    }else if((pos < (encoder_position - (1<<ENCODER_SENCE) + 1))
    	&&((encoder_position - pos)>((ENCODER_MAX<<ENCODER_SENCE)>>1)))
    {
    	//pos
    	if(enc_dir == -1)
    	{
    		#ifdef ENCODER_DEBUG
    			tx0_push('#');
    			tx0_push(' ');
    		#endif //ENCODER_DEBUG
    
    		tx0_dec(enc_num);
    
    		#ifdef ENCODER_DEBUG
    			tx0_push(' ');
    			tx0_push('#');
    		#endif //ENCODER_DEBUG
    
    		tx0_start();
    		enc_num = 0;
    	}
    	enc_time = 0;
    	enc_dir = 1;
    
    	enc_num += (pos + (ENCODER_MAX<<ENCODER_SENCE) - encoder_position)>>ENCODER_SENCE;
    
    	if(enc_num >= 10)
    	{
    		enc_num = 0;
    	}
    
    	#ifdef ENCODER_DEBUG
    		tx0_push('<');
    		tx0_dec(enc_num);
    		tx0_push('>');
    		tx0_start();
    	#endif //ENCODER_DEBUG
    
    	encoder_position = pos;
    }else if((pos < (encoder_position - (1<<ENCODER_SENCE) + 1))
    	&&((encoder_position - pos)<((ENCODER_MAX<<ENCODER_SENCE)>>1)))
    {
    	//neg
    	if(enc_dir == 1)
    	{
    		#ifdef ENCODER_DEBUG
    			tx0_push('#');
    			tx0_push(' ');
    		#endif //ENCODER_DEBUG
    
    		tx0_dec(enc_num);
    
    		#ifdef ENCODER_DEBUG
    			tx0_push(' ');
    			tx0_push('#');
    		#endif //ENCODER_DEBUG
    
    		tx0_start();
    		enc_num = 0;
    	}
    	enc_time = 0;
    	enc_dir = -1;
    
    	enc_num += (encoder_position - pos)>>ENCODER_SENCE;
    
    	if(enc_num >= 10)
    	{
    		enc_num = 0;
    	}
    
    	#ifdef ENCODER_DEBUG
    		tx0_push('(');
    		tx0_dec(enc_num);
    		tx0_push(')');
    		tx0_start();
    	#endif //ENCODER_DEBUG
    
    	encoder_position = pos;
    }else if((pos < (encoder_position + (ENCODER_MAX<<ENCODER_SENCE) - (1<<ENCODER_SENCE) + 1))
    	&&((pos - encoder_position)>((ENCODER_MAX<<ENCODER_SENCE)>>1)))
    {
    	//neg
    	if(enc_dir == 1)
    	{
    		#ifdef ENCODER_DEBUG
    			tx0_push('#');
    			tx0_push(' ');
    		#endif //ENCODER_DEBUG
    
    		tx0_dec(enc_num);
    
    		#ifdef ENCODER_DEBUG
    			tx0_push(' ');
    			tx0_push('#');
    		#endif //ENCODER_DEBUG
    
    		tx0_start();
    		enc_num = 0;
    	}
    	enc_time = 0;
    	enc_dir = -1;
    
    	enc_num += (encoder_position + (ENCODER_MAX<<ENCODER_SENCE) - pos)>>ENCODER_SENCE;
    
    	if(enc_num >= 10)
    	{
    		enc_num = 0;
    	}
    
    	#ifdef ENCODER_DEBUG
    		tx0_push('{');
    		tx0_dec(enc_num);
    		tx0_push('}');
    		tx0_start();
    	#endif //ENCODER_DEBUG
    
    	encoder_position = pos;
    }
    
    if(enc_time < (TO_SEC * 2))
    {
    	enc_time++;
    	if(enc_time == ((TO_SEC * 2)))
    	{
    		#ifdef ENCODER_DEBUG
    			tx0_push('#');
    			tx0_push(' ');
    		#endif //ENCODER_DEBUG
    
    		tx0_dec(enc_num);
    
    		#ifdef ENCODER_DEBUG
    			tx0_push(' ');
    			tx0_push('#');
    		#endif //ENCODER_DEBUG
    
    		tx0_str("\n\r");
    		tx0_start();
    		enc_dir = 0;
    		enc_num = 0;
    	}
    }
    
    

  5. Вопрос: Каково поведение токов и напряжений цепи, приведенной на рисунке 2 в начальный момент времени?

    Буду очень признателен за пояснение )

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

    На самом деле будет примерно так:

    - вы подключаете провод к верхней обкладке конденсатора;

    - затем перемещаете этот провод (проводник) в поле верхнего контакта батарейки. при этом поверхность проводника эквипотенциальна;

    - когда проводник окажется в сколь угодно маленькой области верхнего контакта батарейки их потенциалы практически выровняются;

    - затем касание одного проводника другим с одинаковым потенциалом - тока нет!

     

    Вероятно, при перемещении проводника в поле верхнего контакта батарейки Вы совершаете какую-то работу.

    Если я не прав, то можно получать ток над поверхностью Земли (напряженность, вроде 200 Вольт на метр).

  6. Главное, что не будет одновременного подключения силовухи и измериловки ни при каких обстоятельствах

    Как вариант первая группа еще на силовой части схемы, через ТЭН силовая часть соединяется со второй группой

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

    фаза, а минус измерительной части соединен с землей (заземлен).

    Допустим первая группа контактов реле пригорела при предыдущем переключении. Ведь может такое быть?

  7. Так и есть, надо использовать мерный стаканчик при засыпке стирального порошка в лоток.

    А научившись взвешивать белье, можно от мерного стаканчика отказаться.

    Видеокамера определит степень загрязнения белья, а машинка возьмет из Интернета коэффициент

    "стирабельности" данного моющего средства - и автоматическая доза порошка будет готова.

    А, поскольку мы умеем определять норму порошка в автоматическом режиме, можно сэкономить

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

    кнопки "Стирать" по-моему достаточно.

  8. А с глючащим энкодером - если дело не вылечивается прошивкой, то (как крайний вариант) можно смастерить кондиционер импульсов (на чем-нибудь мелком 6...8-ногом). До такой степени мое недовольство пока не доросло ;)

    Прошивка последняя.

    Думаю, вскрыть и поприжать корпус энкодера будет достаточно (компьютерной мышке это помогало).

    Но нарушать пломбы пока не хотелось бы.

  9. А чего с энкодерами не так ?

    Возможно это проблема только моего экземпляра (хотя в инете встречал замечания на эту тему), но

    при изменении масштаба (что по осям, что по синхронизации) переключит то вверх, то вниз пару раз, то еще вниз.

    Скорость, угол давления на ручку несколько исправляют ситуацию, но все равно не удобно.

    Хотя жить можно)

    По сравнению с моим старым PDS-5022s - день и ночь)

  10. Мне не нравятся только тугие кнопки вокруг экрана и отстутствие крышки, закрывающей экран и кнопки (но есть сумка, докупаемая отдельно).

    А еще глючащие энкодеры и иногда гудящий вентилятор))

  11. Так у Вас проблемы были с 16В танталовыми конденсаторами установленными на номинал до 13.5В?

    Или с другими?

    И да, и нет.

    В нормальных условиях 16В танталовые конденсаторы работают сколь угодно долго при напряжении 13.5В.

    Но блок питания не простой: если по двух каналам 12В одновременно устроить КЗ, то блок сначала будет потреблять

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

    блок начнет потреблять минимальный ток. При таком переходе появляется выброс превышающий 16В. Некоторые

    танталовые конденсаторы этого не переживают.

    Хотя если быть абсолютно точным, то при таких перепадах у нас не взорвался ни один конденсатор.

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

     

  12. Это же какого высочайшего уровня должен быть разработчик, чтобы в устройство с питанием 13.5 В ставить 16-вольтовые конденсаторы.....

    "Разработчик выяснил...." Вычесть из зарплаты у того, кто схему разработчика проверял, а самого разработчика направить доучивать материал, который он прогулял во время учебы.

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

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

     

    Квалификация разработчика более чем достаточна. Перед макетированием практически

    все режимы проверялись моделированием. На первой партии (считай первой итерации)

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

    о величине напряжений при переходном процессе. После этого я (программист) поправил

    софт, так чтобы потребители не отключались от БП одновременно (большой скачок тока)

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

    но на всякий случай расширили номенклатуру (что я считаю отрицательной операцией) - подняли

    напряжение конденсатора до 35В.

     

    По поводу зарплат: это не такая большая контора, где над одним разработчиком два проверяющих и пять начальников.

    По квалификации данный разработчик самый компетентный специалист в данной области в данной организации.

    Проверять некому))

     

    Повторюсь: дело было практически на прототипах. В наличии были только 16В конденсаторы - первые образцы

    работали как часы во всех режимах. Пришли конденсаторы из новой партии - поимели проблем.

     

    Рано или поздно недостаток все равно бы нашли, наблюдая переходные процессы на осциллографе.

     

    В общих чертах требования к блоку питания:

    - входное напряжение от 9В до 40В;

    - выходное напряжение 5В+-10% 1А;

    - два канала по 12В+-20% с ограничением по току 400мА (при токе > 450 мА канал отключается);

    - каналы 12В работают независимо. При аварии напряжение с канала снимается, выдерживается таймаут,

    напряжение подается снова, если в течении таймаута напряжение на выходе не достигнет определенного

    уровня процесс повторяется;

    - без гальваноизоляции;

    - минимальная цена, минимальный габарит, доставабельная комплектуха (срок поставки 2 недели),

    минимум моточных, без калибровок/настроек и т.п.;

    - минимальное время разработки!

     

    Тут обычной квалификации понимаете ли не хватает))

    Эти контролеры по сей день выпускаются серийно. Блок питания приблизительно 1/6 часть всей начинки.

  13. В чем может быть причина такого поведения st-link-ов?

    Может программа отключает SWD?

    Попробуйте с ST-LINK v2 завести еще и сигнал RESET на контроллер (на плате SB11 придется выпаять).

  14. Был один случай когда на вход без резистора подали +16в. :)

    Кристалл накрылся целиком, дорожки 0.35 на 18 мкм поперегорали..

    Не далее чем вчера поимел неприятностей с STM32F373CBT6.

    Вывод PA3 по непонятной мне причине "поджарился" и начал давать утечку на 3В.

    На выход работал исправно. Заменил - все сразу заработало.

  15. что если подать напряжение на вход ацп последовательно через резистор Rain=300к (точность мне не важна

    Без конденсатора на этом же выводе с АЦП будет приходить все что угодно, но не данные о напряжении.

    И, вроде, там смещение в сторону VDD/2 идет (правда не знаю каким током)...

    А бы не стал рисковать - входы у STM32 очень нежные: чуть что не так - КЗ по питанию. Какая тут экономия?

  16. Время ведь понятие человеческое, людям свойственно менять отношение к собственным понятиям.

    Все просто: приведенные формулы годятся для существующего сейчас календаря.

    Когда календарь поменяют, тогда поменяем и формулы.

    Привязываться к астрономической точности в рамках решаемой задачи явный перебор.

    Эдак можно задачу и не решить... ведь в сутках не ровно 24 часа... да и вращается Земля вокруг

    собственной оси с небольшим снижением оборотов...

    А если два события происходят в разных точках пространства... или по разные стороны "линии перемены дат"...

    Условностей много, и это еще без привлечения религий))

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