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

ToR_TDA

Свой
  • Постов

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

  • Посещение

Репутация

0 Обычный

Информация о ToR_TDA

  • Звание
    Местный
    Местный

Контакты

  • Сайт
    Array
  • ICQ
    Array

Информация

  • Город
    Array

Посетители профиля

1 925 просмотров профиля
  1. В общем так я и не понял в чем у меня проблема в режиме контроля входного тока. По достижению примерно 0,48А тока в регистре статуса устанавливается бит IN_IINDPM и рост тока прекращается независимо от состояния регистра IIN_DPM Register и ножки ILIM_HIZ, ножку я уже подключил напрямую к VDDA тем по сути отключив этот лимит полностью и по-идеи остается регистр IIN_DPM, но не работает. Больше пол ампера не выдает, Если снять контроль входного тока то ток просто потихоньку растет по мере поднятия напряжения на ионисторах и не останавливается. Зависит от того что утсановлено в Charge Current Register Но достигал и 2А и больше, что уже перебор для меня.
  2. А это не примерно то же что и FUSB302? А то я только китайскую pdf нашел не все понял)))
  3. Я выяснил что для моей инициализации ChargeOption0 Register 0x024A (с контролем входного тока) регистр IIN_HOST регулирует входной ток, но только вниз до примерно 0,48А Я бы это объяснил ножкой ILIM_HIZ, по идеи выбирается меньшая из двух установок по регистру или по ножке, но там много 2,25В что около 3А
  4. Я купил без проблем и я все понимаю, но это не по теме топика.
  5. Данные из IIN_HOST переписываются в IIN_DPM то есть IIN_HOST это просто буферный регистр, а IIN_DPM только для чтения, но я читаю их оба одновременно, там одинаковые значения, то что я и пишу.
  6. По значениям MaxChargeVoltage Register работает, проверял, заряжает до того уровня что там записано очень точно и затем поддерживает.
  7. При использовании BQ25713 микроконтроллер делает только инициализацию и при использовании Power Delivery переинициализирует регистры. Я говорил именно о отдельном DC-DC на МК, который заменит все функции BQ, то есть измерение 2-х токов входного и выходного, измерение 2-х напряжений, контроль за 2-мя парами. У меня режим от USB только заряд. тут какие задачи 1. принимать на входе 5-20В, то есть либо понижать либо повышать. Максимальное напряжение заряда в BQ в регистре. 2. Контролировать ток как заряда так и от USB дабы выставлять максимум по протоколу, ну или ходя бы просто не перегружать USB.
  8. Я плыты со сборкой заказывал, только 3 штуки опытных, но вообще микросхема не редкость, с некоторым риском можно даже просто на алиэкспресс взять Или про что разговор? Не понял
  9. В общем, для тех кому интересно, что сделал на данный момент: Транзистор Q2 перемкнул. Микросхема работает, с нуля заряжает и показывает в статусе Fast Charge Инициализация ChargeOption0 Register 0x024A Здесь из важного делаем LDO Mode Disable Из того что сейчас проблема, это ток заряда, меряю по входному току от USB Если оставить IDPM Enable то максимальный ток от USB всего 0,5А Если поставить IDPM Disable то ток от USB начинает неограниченно расти по мере заряда, я прервал на более 2А При этом ток заряда 2048 mA в регистре Charge Current Register Режим ограничения входного тока IDPM Enable вроде как штука очень удобная и нужная, но я не понимаю откуда берется такое маленькое ограничение. В регистр за это отвечающий IIN_HOST Register пишу 0x1E00 что примерно 1,5А на ножке ILIM_HIZ аналогового выбора ограничения 2,25В, что по идеи равно 3А. Это в любом случае будет такая же топология, но возможно да, можно было бы управлять этим просто от МК, 2 комплементарных ШИМ и 4 входа АЦП. Но это такая себе приличная задача. Делать что-то в аналоге, это такое себе удовольствие, тут много режимов Входное напряжение 5-20В при выходном 10В то есть и повышаем и понижаем, все с контролем тока. Аналоговое управляемое решение конечно возможно, но по нынешним меркам мне легче даже было бы отдельный небольшой МК на управляемый DC-DC поставить. Что-то сразу не подумал. Но опять таки это задача выходила за рамки.
  10. Сейчас разбираюсь конкретно с BQ25713 Если есть предложения с учетом PD, то интересно. Была конечно сразу такая идея и возможно так и сделаю, хоят непонятно как будет работать МС при этом, какой ток будет. Думал может кто с ними работал, знает что. Я просто думаю, что её все таки можно запустить на зарядку от нуля, хотя возможно ошибаюсь Записываю 0x4A03 в ChargeOption0 Register с проверкой записи, вроде тем самым обнуляю бит LDO Mode Enable When battery voltage is below minimum system voltage (REG0x0D/0C()), the charger is in pre-charge with LDO mode enabled. 0b: Disable LDO mode, BATFET fully ON. Precharge current is set by battery pack internal resistor. The system is regulated by the MaxChargeVoltage register. Но ничего не меняется, ток управляется, кстати из Charge Current Register, но транзистор все равно в линейном
  11. Да, 0x0004, 0x0002, 0x0008 И да, 4 ионистора основной источник в автономном режиме.
  12. Не, запись 1,024 В в MinSystemVoltage не приводит к успеху. CHRG_OK гаснет через задержку и ничего не происходит.
  13. Спасибо за ответ. Во, именно у меня получается LDO Mode , потому транзистор в линейном, но в MinSystemVoltage Register по дефолту 0В и я еще его тоже обновлял на 0x0000 и это не меняет ситуацию. По идеи я должен как-то перейти сразу к режиму Charge, но что я должен сделать. Хм, интересно, почему? Что я проглядел? Ну, типа Power Delivery в будущем Это не резервирование, это основной источник питания устройства, оно автономное, решил заложить режим быстрой зарядки от USB PD, такое требование.
  14. Уважаемые форумчане, Работал ли кто-то с микросхема Buck-Boost конвертера для зарядки батарей. У меня немного специфичная задача от её типового применения, я заряжаю 4 ионистора, а не LiIon, потому у меня процесс зарядки от нуля может происходить. Сейчас на плате микроконтроллер подключен к ней по I2C и связь есть, регистры читаются корректно, то что и должно быть в дефолтном состоянии. Не совсем понимаю как я должен ее инициализировать дабы получить заряд до 2,7x4В с током 1-2А для начала. Хочу получить управление именно по регистрам, а не по внешним ножкам. Схема как на EVO плате, питание USB 5В Ножка CHRG_OK устанавливается в Ок, как положено. Сейчас пишу в регистры: Charge Current Register MaxChargeVoltage Register Микросхеме реагирует, но греется транзистор Q2 на выходе. Это собственно и проблема, он в линейном режиме находится, а должен быть открыт. Это описано, что он может быть в линейном, на как это изменить я что-то понять не могу. bq25713.pdf tidrxq7.pdf
  15. В общем, сам спросил сам и отвечаю:) Все сделал в точности по примеру "Example 2: 3p3z compensator" из приведенного выше документа только с изменением на КИХ фильтр и вывод на ЦАП по ДМА. Показываю ключевые моменты кода. Главная идея, что данные от АЦП передаем через DMA напрямую в FMAС "perip to perip". На самом деле там в примере есть "секреточка", а в целом все проблемы связаны с тем, что ST еще не допилили ни CMSIS, ни CubeMX, ни свои библиотеки под этот новый блок до конца. #define FILTER_OUT_BUFFER_SIZE 1 #define FILTER_IN_BUFFER_SIZE 1 #define FILTER_TAP 127 ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; DAC_HandleTypeDef hdac2; DMA_HandleTypeDef hdma_dac2_ch1; FMAC_HandleTypeDef hfmac; DMA_HandleTypeDef hdma_fmac_read; TIM_HandleTypeDef htim4; uint16_t ADC_data[FILTER_IN_BUFFER_SIZE]; // Данные с АЦП uint16_t FMAC_out[FILTER_OUT_BUFFER_SIZE]; // Данные на выходе фильтра static int16_t FilterCoeffB[127] = // Коэффициенты КИХ {-10,-10,-10,-9,-9,-9,-8,-8,-7,-6,-5,-4,-2,0,3,6,10,14,19,25,32,40,48,57,68,79,91,104,118,134,150, 166,184,203,222,242,263,284,306,328,350,373,396,418,441,463,485,506,527,547,566,585,602,618,633, 646,659,669,679,686,692,696,699,700,699,696,692,686,679,669,659,646,633,618,602,585,566,547,527, 506,485,463,441,418,396,373,350,328,306,284,263,242,222,203,184,166,150,134,118,104,91,79,68,57, 48,40,32,25,19,14,10,6,3,0,-2,-4,-5,-6,-7,-8,-8,-9,-9,-9,-10,-10,-10}; int main(void) { __HAL_RCC_FMAC_CLK_ENABLE(); // Структура для настройки фильтра FMAC_FilterConfigTypeDef sFmacConfig; // declare a filter configuration structure sFmacConfig.CoeffBaseAddress = 0; // Set the coefficient buffer base address sFmacConfig.CoeffBufferSize = FILTER_TAP; // Set the coefficient buffer size to the number of coeffs sFmacConfig.InputBaseAddress = FILTER_TAP; // Set the Input buffer base address to the next free address sFmacConfig.InputBufferSize = FILTER_TAP + 1; // Set the input buffer size greater than the number of coeffs sFmacConfig.InputThreshold = 0; // Set the input watermark to zero since we are using DMA sFmacConfig.OutputBaseAddress = FILTER_TAP*2 + 1; // Set the Output buffer base address to the next free address sFmacConfig.OutputBufferSize = FILTER_OUT_BUFFER_SIZE;// Set the output buffer size sFmacConfig.OutputThreshold = 0; // Set the output watermark to zero since we are using DMA sFmacConfig.pCoeffA = NULL; // No A coefficients since FIR sFmacConfig.CoeffASize = 0; sFmacConfig.pCoeffB = FilterCoeffB; // Pointer to the coefficients in memory sFmacConfig.CoeffBSize = FILTER_TAP; // Number of coefficients sFmacConfig.Filter = FMAC_FUNC_CONVO_FIR; // Select FIR filter function //sFmacConfig.InputAccess = FMAC_BUFFER_ACCESS_DMA; // Enable DMA input transfer sFmacConfig.InputAccess = FMAC_BUFFER_ACCESS_NONE;// Disable DMA input transfer sFmacConfig.OutputAccess = FMAC_BUFFER_ACCESS_DMA;// Enable DMA output transfer sFmacConfig.Clip = FMAC_CLIP_ENABLED; // Enable clipping of the output at 0x7FFF and 0x8000 sFmacConfig.P = FILTER_TAP; // P parameter contains number of coefficients sFmacConfig.Q = 0; // Q parameter is not used sFmacConfig.R = 0; // R parameter contains the post-shift value (none) if (HAL_FMAC_FilterConfig(&hfmac, &sFmacConfig) != HAL_OK) // Configure the FMAC Error_Handler(); // Configuration Error uint16_t Filter_output_Size = FILTER_OUT_BUFFER_SIZE; // Только так:) HAL_FMAC_FilterStart(&hfmac, (int16_t*)&FMAC_out, &Filter_output_Size); // Запускаем FMAC uint32_t *Fmac_Wdata; // Fmac_Wdata = (uint32_t *) FMAC->WDATA; // Так работать не будет Fmac_Wdata = (uint32_t *) 0x40021418; // Секреточка:) HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); // ADC Calibration HAL_ADC_Start_DMA(&hadc1, Fmac_Wdata, FILTER_IN_BUFFER_SIZE); // Запускаем АЦП с сохранением по DMA HAL_DAC_Start_DMA(&hdac2, DAC_CHANNEL_1, (uint32_t*)&FMAC_out, FILTER_OUT_BUFFER_SIZE, DAC_ALIGN_12B_R); // Выводим входные данные FIR фильтра на ЦАП HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); // Запускаем таймер для тактирования всего while (1) { } } static void MX_ADC1_Init(void) { ADC_MultiModeTypeDef multimode = {0}; ADC_ChannelConfTypeDef sConfig = {0}; /** Common config*/ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.GainCompensation = 0; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T4_TRGO; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; hadc1.Init.DMAContinuousRequests = ENABLE; hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; hadc1.Init.OversamplingMode = DISABLE; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure the ADC multi-mode*/ multimode.Mode = ADC_MODE_INDEPENDENT; if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel*/ sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 1; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } }
×
×
  • Создать...