完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
Hi,
我在用G474 HRtiM驱动BLDC电机,尝试使用ADC trigger在下管导通时(CMP2作为reset source)去触发低侧电流感应。现在的问题是即使CMP2中断回调可以被正常调用,PWM波形也正常,ADC依然没被触发。 因为没有使用CubeMX生成代码,是对着Cube包内的Example抄的,所以我想可能是某些信号配置在硬件上不可实现。但是我检查了Datasheet和用Cube生成的代码,我的配置是可以实现的。 ADC和HRTIM配置如下: __HAL_RCC_ADC12_CLK_ENABLE(); this->adc1_handle.Instance = ADC1; this->adc1_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; this->adc1_handle.Init.Resolution = ADC_RESOLUTION_12B; this->adc1_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; this->adc1_handle.Init.GainCompensation = 0; this->adc1_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; this->adc1_handle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; this->adc1_handle.Init.LowPowerAutoWait = DISABLE; this->adc1_handle.Init.ContinuousConvMode = DISABLE; this->adc1_handle.Init.NbrOfConversion = 1; this->adc1_handle.Init.DiscontinuousConvMode = DISABLE; this->adc1_handle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_HRTIM_TRG6; // this->adc1_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; this->adc1_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; this->adc1_handle.Init.DMAContinuousRequests = DISABLE; this->adc1_handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; this->adc1_handle.Init.OversamplingMode = DISABLE; auto result = HAL_ADC_Init(&(this->adc1_handle)); if (result != HAL_OK) throw hardware_error(result, "HAL_ADC_Init ADC1"); ADC_MultiModeTypeDef multimode1 = {}; multimode1.Mode = ADC_MODE_INDEPENDENT; result = HAL_ADCEx_MultiModeConfigChannel(&(this->adc1_handle), &multimode1); if (result != HAL_OK) throw hardware_error(result, "HAL_ADCEx_MultiModeConfigChannel ADC1"); this->vopamp1_handle.Channel = ADC_CHANNEL_VOPAMP1; this->vopamp1_handle.Rank = ADC_REGULAR_RANK_1; this->vopamp1_handle.SamplingTime = ADC_SAMPLETIME_640CYCLES_5; this->vopamp1_handle.SingleDiff = ADC_SINGLE_ENDED; this->vopamp1_handle.OffsetNumber = ADC_OFFSET_NONE; this->vopamp1_handle.Offset = 0; result = HAL_ADC_ConfigChannel(&(this->adc1_handle), &(this->vopamp1_handle)); if (result != HAL_OK) throw hardware_error(result, "HAL_ADC_ConfigChannel VOPAMP1"); result = HAL_ADCEx_Calibration_Start(&(this->adc1_handle), ADC_SINGLE_ENDED); if (result != HAL_OK) throw hardware_error(result, "HAL_ADCEx_Calibration_Start ADC1"); HAL_NVIC_SetPriority(ADC1_2_IRQn, 7, 0); HAL_NVIC_EnableIRQ(ADC1_2_IRQn); result = HAL_ADC_Start_IT(&(this->adc1_handle)); if (result != HAL_OK) throw hardware_error(result, "HAL_ADC_Start ADC1");__HAL_RCC_HRTIM1_CLK_ENABLE(); gpio_hrtim_u_p.Pin = GPIO_PIN_8; gpio_hrtim_u_p.Mode = GPIO_MODE_AF_PP; gpio_hrtim_u_p.Pull = GPIO_PULLDOWN; gpio_hrtim_u_p.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_u_p.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOA, &gpio_hrtim_u_p); gpio_hrtim_u_n.Pin = GPIO_PIN_9; gpio_hrtim_u_n.Mode = GPIO_MODE_AF_PP; gpio_hrtim_u_n.Pull = GPIO_PULLDOWN; gpio_hrtim_u_n.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_u_n.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOA, &gpio_hrtim_u_n); gpio_hrtim_v_p.Pin = GPIO_PIN_12; gpio_hrtim_v_p.Mode = GPIO_MODE_AF_PP; gpio_hrtim_v_p.Pull = GPIO_PULLDOWN; gpio_hrtim_v_p.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_v_p.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOB, &gpio_hrtim_v_p); gpio_hrtim_v_n.Pin = GPIO_PIN_13; gpio_hrtim_v_n.Mode = GPIO_MODE_AF_PP; gpio_hrtim_v_n.Pull = GPIO_PULLDOWN; gpio_hrtim_v_n.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_v_n.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOB, &gpio_hrtim_v_n); gpio_hrtim_w_p.Pin = GPIO_PIN_14; gpio_hrtim_w_p.Mode = GPIO_MODE_AF_PP; gpio_hrtim_w_p.Pull = GPIO_PULLDOWN; gpio_hrtim_w_p.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_w_p.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOB, &gpio_hrtim_w_p); gpio_hrtim_w_n.Pin = GPIO_PIN_15; gpio_hrtim_w_n.Mode = GPIO_MODE_AF_PP; gpio_hrtim_w_n.Pull = GPIO_PULLDOWN; gpio_hrtim_w_n.Speed = GPIO_SPEED_FREQ_VERY_HIGH; gpio_hrtim_w_n.Alternate = GPIO_AF13_HRTIM1; HAL_GPIO_Init(GPIOB, &gpio_hrtim_w_n); HRTIM_TimeBaseCfgTypeDef hrtim_timebase_cfg; HRTIM_TimerCtlTypeDef hrtim_timer_ctl; HRTIM_TimerCfgTypeDef hrtim_timer_cfg; HRTIM_CompareCfgTypeDef hrtim_compare_cfg; HRTIM_OutputCfgTypeDef hrtim_output_cfg; HRTIM_DeadTimeCfgTypeDef hrtim_deadtime_cfg; HRTIM_ADCTriggerCfgTypeDef hrtim_adctrig_cfg; this->hrtim_handle.Instance = HRTIM1; this->hrtim_handle.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; this->hrtim_handle.Init.SyncOptions = HRTIM_SYNCOPTION_NONE; auto result = HAL_HRTIM_Init(&(this->hrtim_handle)); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_Init"); std::printf("hrtim: configured, no ITn"); result = HAL_HRTIM_DLLCalibrationStart(&(this->hrtim_handle), HRTIM_CALIBRATIONRATE_1); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_DLLCalibrationStart"); result = HAL_HRTIM_PollForDLLCalibration(&(this->hrtim_handle), 10); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_PollForDLLCalibration"); std::printf("hrtim: calibrated, period: HRTIM_CALIBRATIONRATE_1 (0.7ms)n"); timebase_period = (HAL_RCC_GetSysClockFreq() * (32 / this->prescaler_radio)) / this->desired_frequency; hrtim_timebase_cfg.Mode = HRTIM_MODE_CONTINUOUS; hrtim_timebase_cfg.Period = timebase_period; hrtim_timebase_cfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL4; hrtim_timebase_cfg.RepetitionCounter = 0; result = HAL_HRTIM_TimeBaseConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_MASTER, &hrtim_timebase_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_TimeBaseConfig Master"); std::printf("hrtim: master timebase mode: HRTIM_MODE_CONTINUOUS, prescaler: HRTIM_PRESCALERRATIO_MUL4n"); std::printf("hrtim: master timebase period: %llun", (unsigned long long)timebase_period); result = HAL_HRTIM_TimeBaseConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, &hrtim_timebase_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_TimeBaseConfig CHA"); result = HAL_HRTIM_TimeBaseConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, &hrtim_timebase_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_TimeBaseConfig CHC"); result = HAL_HRTIM_TimeBaseConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, &hrtim_timebase_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_TimeBaseConfig CHD"); std::printf("hrtim: timebase mode: HRTIM_MODE_CONTINUOUS, prescaler: HRTIM_PRESCALERRATIO_MUL4n"); std::printf("hrtim: timebase period: %llun", (unsigned long long)timebase_period); hrtim_timer_ctl.DualChannelDacEnable = HRTIM_TIMER_DCDE_DISABLED; hrtim_timer_ctl.GreaterCMP1 = HRTIM_TIMERGTCMP1_EQUAL; hrtim_timer_ctl.GreaterCMP3 = HRTIM_TIMERGTCMP3_EQUAL; hrtim_timer_ctl.TrigHalf = HRTIM_TIMERTRIGHALF_DISABLED; hrtim_timer_ctl.UpDownMode = HRTIM_TIMERUPDOWNMODE_UP; result = HAL_HRTIM_WaveformTimerControl(&(this->hrtim_handle), HRTIM_TIMERINDEX_MASTER, &hrtim_timer_ctl); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerControl Master"); std::printf("hrtim: master timecontrol mode: up, HRTIM_TIMERGTCMP1_EQUAL, HRTIM_TIMERGTCMP3_EQUALn"); result = HAL_HRTIM_WaveformTimerControl(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, &hrtim_timer_ctl); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerControl CHA"); result = HAL_HRTIM_WaveformTimerControl(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, &hrtim_timer_ctl); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerControl CHC"); result = HAL_HRTIM_WaveformTimerControl(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, &hrtim_timer_ctl); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerControl CHD"); std::printf("hrtim: timecontrol mode: up, HRTIM_TIMERGTCMP1_EQUAL, HRTIM_TIMERGTCMP3_EQUALn"); hrtim_timer_cfg.InterruptRequests = HRTIM_TIM_IT_REP; hrtim_timer_cfg.DMARequests = HRTIM_TIM_DMA_NONE; hrtim_timer_cfg.DMASrcAddress = 0x0000; hrtim_timer_cfg.DMADstAddress = 0x0000; hrtim_timer_cfg.DMASize = 0x1; hrtim_timer_cfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED; hrtim_timer_cfg.InterleavedMode = HRTIM_INTERLEAVED_MODE_DISABLED; hrtim_timer_cfg.StartOnSync = HRTIM_SYNCSTART_DISABLED; hrtim_timer_cfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED; hrtim_timer_cfg.DACSynchro = HRTIM_DACSYNC_NONE; hrtim_timer_cfg.PreloadEnable = HRTIM_PRELOAD_ENABLED; hrtim_timer_cfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT; hrtim_timer_cfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK; hrtim_timer_cfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED; hrtim_timer_cfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED; hrtim_timer_cfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE; hrtim_timer_cfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE; hrtim_timer_cfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_DISABLED; hrtim_timer_cfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED; hrtim_timer_cfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE; hrtim_timer_cfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE; hrtim_timer_cfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED; hrtim_timer_cfg.ReSyncUpdate = HRTIM_TIMERESYNC_UPDATE_UNCONDITIONAL; result = HAL_HRTIM_WaveformTimerConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_MASTER, &hrtim_timer_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerConfig CHA"); std::printf( "hrtim: master timebase config: independent, repetition IT, no DMA, no reset, dead time insertion " "disabledn"); hrtim_timer_cfg.InterruptRequests = HRTIM_TIM_IT_NONE; hrtim_timer_cfg.DMARequests = HRTIM_TIM_DMA_NONE; hrtim_timer_cfg.DMASrcAddress = 0x0000; hrtim_timer_cfg.DMADstAddress = 0x0000; hrtim_timer_cfg.DMASize = 0x1; hrtim_timer_cfg.HalfModeEnable = HRTIM_HALFMODE_DISABLED; hrtim_timer_cfg.InterleavedMode = HRTIM_INTERLEAVED_MODE_DISABLED; hrtim_timer_cfg.StartOnSync = HRTIM_SYNCSTART_DISABLED; hrtim_timer_cfg.ResetOnSync = HRTIM_SYNCRESET_DISABLED; hrtim_timer_cfg.DACSynchro = HRTIM_DACSYNC_NONE; hrtim_timer_cfg.PreloadEnable = HRTIM_PRELOAD_ENABLED; hrtim_timer_cfg.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT; hrtim_timer_cfg.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK; hrtim_timer_cfg.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED; hrtim_timer_cfg.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED; hrtim_timer_cfg.FaultEnable = HRTIM_TIMFAULTENABLE_NONE; hrtim_timer_cfg.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE; hrtim_timer_cfg.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED; hrtim_timer_cfg.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED; hrtim_timer_cfg.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_NONE; hrtim_timer_cfg.ResetTrigger = HRTIM_TIMRESETTRIGGER_MASTER_PER; hrtim_timer_cfg.ResetUpdate = HRTIM_TIMUPDATEONRESET_ENABLED; hrtim_timer_cfg.ReSyncUpdate = HRTIM_TIMERESYNC_UPDATE_UNCONDITIONAL; result = HAL_HRTIM_WaveformTimerConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, &hrtim_timer_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerConfig CHA"); result = HAL_HRTIM_WaveformTimerConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, &hrtim_timer_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerConfig CHC"); hrtim_timer_cfg.DelayedProtectionMode = HRTIM_TIMER_D_E_DELAYEDPROTECTION_DISABLED; result = HAL_HRTIM_WaveformTimerConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, &hrtim_timer_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformTimerConfig CHD"); std::printf( "hrtim: timebase config: independent, no IT, no DMA, reset on master PER, dead time insertion enabledn"); // hrtim_compare_cfg.CompareValue = -1; // hrtim_compare_cfg.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR; // hrtim_compare_cfg.AutoDelayedTimeout = 0; // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_1, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHA"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_2, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHA"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_COMPAREUNIT_3, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHA"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_1, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHC"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_2, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHC"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_COMPAREUNIT_3, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHC"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_1, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHD"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_2, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHD"); // result = HAL_HRTIM_WaveformCompareConfig( // &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_COMPAREUNIT_3, &hrtim_compare_cfg); // if (result != HAL_OK) // throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig CHD"); std::printf("hrtim: compare config: not touch on all channelsn"); hrtim_output_cfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; hrtim_output_cfg.SetSource = HRTIM_OUTPUTSET_TIMCMP1; hrtim_output_cfg.ResetSource = HRTIM_OUTPUTSET_TIMCMP2; hrtim_output_cfg.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE; hrtim_output_cfg.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE; hrtim_output_cfg.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_NONE; hrtim_output_cfg.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; hrtim_output_cfg.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA1, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TA1"); result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TC1"); result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD1, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TD1"); hrtim_output_cfg.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; hrtim_output_cfg.SetSource = HRTIM_OUTPUTSET_TIMCMP2; hrtim_output_cfg.ResetSource = HRTIM_OUTPUTSET_TIMCMP1; result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_OUTPUT_TA2, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TA2"); result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC2, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TC2"); result = HAL_HRTIM_WaveformOutputConfig( &(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_OUTPUT_TD2, &hrtim_output_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCompareConfig TD2"); std::printf("hrtim: output config: Tx1 up at TIMPER and down at CMP1, Tx2 up at CMP1 and down at TIMPERn"); auto deadtime_period_rise = (unsigned int)(((unsigned long long)HAL_RCC_GetSysClockFreq() * (32 / this->prescaler_radio) * this->desired_deadtime_rise) / 1000000000); auto deadtime_period_fall = (unsigned int)(((unsigned long long)HAL_RCC_GetSysClockFreq() * (32 / this->prescaler_radio) * this->desired_deadtime_fall) / 1000000000); hrtim_deadtime_cfg.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL4; // 1.73ns per step hrtim_deadtime_cfg.RisingValue = deadtime_period_rise; hrtim_deadtime_cfg.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE; hrtim_deadtime_cfg.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_READONLY; hrtim_deadtime_cfg.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY; hrtim_deadtime_cfg.FallingValue = deadtime_period_fall; hrtim_deadtime_cfg.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE; hrtim_deadtime_cfg.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_READONLY; hrtim_deadtime_cfg.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY; result = HAL_HRTIM_DeadTimeConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, &hrtim_deadtime_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_DeadTimeConfig CHA"); result = HAL_HRTIM_DeadTimeConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, &hrtim_deadtime_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_DeadTimeConfig CHC"); result = HAL_HRTIM_DeadTimeConfig(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, &hrtim_deadtime_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_DeadTimeConfig CHD"); std::printf( "hrtim: deadtime config: rising %dns, falling %dns, period: rising %u, falling %un", (unsigned int)this->desired_deadtime_rise, (unsigned int)this->desired_deadtime_fall, (unsigned int)deadtime_period_rise, (unsigned int)deadtime_period_fall); hrtim_adctrig_cfg.Trigger = HRTIM_ADCTRIGGERUPDATE_TIMER_A; hrtim_adctrig_cfg.UpdateSource = HRTIM_ADCTRIGGEREVENT6810_TIMERA_CMP2; result = HAL_HRTIM_ADCTriggerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_6, &hrtim_adctrig_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCTriggerConfig CHA"); result = HAL_HRTIM_ADCPostScalerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_6, 0x0); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCPostScalerConfig CHA"); std::printf("hrtim: adc trigger 6: Timer A, CMP2n"); hrtim_adctrig_cfg.Trigger = HRTIM_ADCTRIGGERUPDATE_TIMER_C; hrtim_adctrig_cfg.UpdateSource = HRTIM_ADCTRIGGEREVENT6810_TIMERC_CMP2; result = HAL_HRTIM_ADCTriggerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_8, &hrtim_adctrig_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCTriggerConfig CHC"); result = HAL_HRTIM_ADCPostScalerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_8, 0x0); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCPostScalerConfig CHC"); std::printf("hrtim: adc trigger 8: Timer C, CMP2n"); hrtim_adctrig_cfg.Trigger = HRTIM_ADCTRIGGERUPDATE_TIMER_D; hrtim_adctrig_cfg.UpdateSource = HRTIM_ADCTRIGGEREVENT6810_TIMERD_CMP2; result = HAL_HRTIM_ADCTriggerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_10, &hrtim_adctrig_cfg); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCTriggerConfig CHD"); result = HAL_HRTIM_ADCPostScalerConfig(&(this->hrtim_handle), HRTIM_ADCTRIGGER_10, 0x0); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_ADCPostScalerConfig CHD"); std::printf("hrtim: adc trigger 10: Timer D, CMP2n"); __arisa_hrtim_handle = &(this->hrtim_handle); result = HAL_HRTIM_WaveformOutputStart(&(this->hrtim_handle), HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TA2); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformOutputStart CHA"); std::printf("hrtim: U phase startedn"); result = HAL_HRTIM_WaveformOutputStart(&(this->hrtim_handle), HRTIM_OUTPUT_TC1 | HRTIM_OUTPUT_TC2); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformOutputStart CHC"); std::printf("hrtim: V phase startedn"); result = HAL_HRTIM_WaveformOutputStart(&(this->hrtim_handle), HRTIM_OUTPUT_TD1 | HRTIM_OUTPUT_TD2); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformOutputStart CHD"); std::printf("hrtim: W phase startedn"); result = HAL_HRTIM_WaveformCountStart( &(this->hrtim_handle), HRTIM_TIMERID_MASTER | HRTIM_TIMERID_TIMER_A | HRTIM_TIMERID_TIMER_C | HRTIM_TIMERID_TIMER_D); if (result != HAL_OK) throw hardware_error(result, "HAL_HRTIM_WaveformCountStart Master"); __HAL_HRTIM_MASTER_ENABLE_IT(&(this->hrtim_handle), HRTIM_MASTER_IT_MREP); HAL_NVIC_SetPriority(HRTIM1_Master_IRQn, 6, 0); HAL_NVIC_EnableIRQ(HRTIM1_Master_IRQn); // __HAL_HRTIM_TIMER_ENABLE_IT(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_A, HRTIM_TIM_IT_CMP2); // HAL_NVIC_SetPriority(HRTIM1_TIMA_IRQn, 6, 1); // HAL_NVIC_EnableIRQ(HRTIM1_TIMA_IRQn); // __HAL_HRTIM_TIMER_ENABLE_IT(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_C, HRTIM_TIM_IT_CMP2); // HAL_NVIC_SetPriority(HRTIM1_TIMC_IRQn, 6, 2); // HAL_NVIC_EnableIRQ(HRTIM1_TIMC_IRQn); // __HAL_HRTIM_TIMER_ENABLE_IT(&(this->hrtim_handle), HRTIM_TIMERINDEX_TIMER_D, HRTIM_TIM_IT_CMP2); // HAL_NVIC_SetPriority(HRTIM1_TIMD_IRQn, 6, 3); // HAL_NVIC_EnableIRQ(HRTIM1_TIMD_IRQn); |
|
相关推荐
1个回答
|
|
|
在使用STM32G474的HRTIM(High-Resolution Timer)来触发ADC时,确实可能会遇到一些问题,尤其是当你手动配置寄存器而不是使用CubeMX生成的代码时。以下是一些可能的原因和解决方案,帮助你排查问题: 1. 检查HRTIM和ADC的时钟配置
2. HRTIM的CMP2配置
3. HRTIM的ADC触发配置
4. ADC的触发源配置
5. 检查ADC的触发信号
6. 中断和DMA配置
7. 硬件连接
8. 调试工具
9. 参考手册和例程
10. 其他可能的问题
通过以上步骤,你应该能够逐步排查并解决HRTIM无法正常触发ADC的问题。如果问题仍然存在,建议使用调试工具逐步检查各个寄存器的值,或者将问题简化,逐步验证每个模块的功能。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
stm32mp157的异核通信的rpmsg_sdb的m4固件和a7驱动该如何编写?
1464 浏览 0 评论
stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差
1517 浏览 0 评论
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
3662 浏览 1 评论
3855 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
2474 浏览 1 评论
STM32H7打开DCache后,出现了串口接收信息为空的现象,是哪里出了问题?
741浏览 5评论
用NANO STM32F103RBT6的开发板烧录不了是哪里出了问题?
673浏览 5评论
720浏览 5评论
外部中断触发类型为双边沿触发,进入中断回调后有什么办法判断该边沿是上升沿还是下降沿?
959浏览 5评论
STM32L071CBT6低温环境下无法正常工作是什么原因引起的?
760浏览 5评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-8 09:34 , Processed in 1.352754 second(s), Total 78, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
430