问答

汇集网友智慧,解决技术难题

21ic问答首页 -

ni ST TI 调试 断电 ADC

2025-08-22
/*这是我ADC初始化部分*/
  1. void adc_init(void)
  2. {

  3.     /* 使能ADC时钟 */
  4.     std_rcc_apb2_clk_enable(RCC_PERIPH_CLK_ADC);
  5.       
  6.         /* ADC_CK时钟为PLCK的三分频 */
  7.     std_adc_clock_config(ADC_CK_DIV3);
  8.    
  9.                 //这里更改为定时器触发
  10.     //std_adc_trig_sw();
  11.     std_adc_trig_config(ADC_TRIG_HW_EDGE_RISING,ADC_EXTRIG_TIM1_OC4_ADC);
  12.    
  13.     /* 单次采样模式 */
  14.     std_adc_conversion_mode_config(ADC_SINGLE_CONVER_MODE);
  15.    
  16.     /* 采样时间配置,119周期*/
  17.     std_adc_sampt_time_config(ADC_SAMPTIME_3CYCLES);
  18.    
  19.     /* 选择通道 */
  20.                 std_adc_fix_sequence_channel_enable(ADC_CHANNEL_1);  // 使能AIN1(PA3)- 相电压
  21.                 std_adc_fix_sequence_channel_enable(ADC_CHANNEL_3);  // 使能AIN3(PA6)- 相电压
  22.                 std_adc_fix_sequence_channel_enable(ADC_CHANNEL_4);  // 使能AIN4(PA7)- 相电压
  23.                 std_adc_fix_sequence_channel_enable(ADC_CHANNEL_5);  // 使能AIN5(PB3)- 母线电压
  24.                 std_adc_fix_sequence_channel_enable(ADC_CHANNEL_7);  // 使能AIN7(PB0)- 电池电压
  25.    
  26.     /* 配置Wait模式,避免数据未及时读取,转换溢出 */
  27.     std_adc_wait_mode_enable();
  28.                 /* 使能ADC */
  29.     std_adc_enable();
  30.     /* 等待ADC使能状态稳定 */
  31.     std_delayus(ADC_EN_DELAY);       

  32.                 std_adc_interrupt_enable(ADC_INTERRUPT_EOC);
  33.                 std_adc_interrupt_enable(ADC_INTERRUPT_EOS);  // 序列完成中断
  34.                

  35. }

  1. /*这是我定时器的配置*/
  2. void tim1_init(void)
  3. {
  4.                 std_tim_basic_init_t basic_init = {0};   
  5.     std_tim_output_compare_init_t output_init = {0};
  6.     std_tim_break_init_t break_config = {0};
  7.    
  8.     /* TIM1时钟使能(对应原函数的__SYSCTRL_ATIM_CLK_ENABLE()) */
  9.     std_rcc_apb2_clk_enable(RCC_PERIPH_CLK_TIM1);
  10.                
  11.                 PWM_AL_ON;
  12.                 PWM_BL_ON;
  13.                 PWM_CL_ON;

  14.     /* 初始化基本定时器参数(对应ATIM_InitStruct配置) */
  15.     basic_init.prescaler = 0;                          // 预分频=0
  16.     basic_init.counter_mode = TIM_COUNTER_MODE_UP;      // 向上计数
  17.     basic_init.period = PWM_PERIOD - 1;                 // 自动重装载值
  18.     basic_init.clock_div = TIM_CLOCK_DTS_DIV1;          // 时钟不分频
  19.     basic_init.repeat_counter = 0;                      // 重复计数器=0
  20.     std_tim_init(TIM1, &basic_init);
  21.                
  22.        
  23.                
  24.     /* 配置输出比较模式(对应ATIM_OCInitStruct配置) */
  25.     output_init.output_compare_mode = TIM_OUTPUT_MODE_PWM1;  // PWM模式1
  26.     output_init.output_state = TIM_OUTPUT_ENABLE;            // 主输出使能
  27.     output_init.output_negtive_state = TIM_OUTPUT_NEGTIVE_DISABLE;  // 禁用互补输出
  28.     output_init.pulse = 0;                                   // 初始占空比=0(后续通过SetCompare更新)
  29.     output_init.output_pol = TIM_OUTPUT_POL_HIGH;             // 非反相输出
  30.     output_init.output_negtive_pol = TIM_OUTPUT_NEGTIVE_POL_HIGH;  // 互补输出极性(未使用,默认高)
  31.     output_init.output_idle_state = TIM_OUTPUT_IDLE_RESET;    // 空闲状态复位
  32.     output_init.output_negtive_idle_state = TIM_OUTPUT_NEGTIVE_IDLE_RESET;  

  33.     /* 初始化通道1~4(对应原代码ATIM_OC1~4Init) */
  34.     std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_1);  // 通道1(上桥臂A相)
  35.     std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_2);  // 通道2(上桥臂B相)
  36.     std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_3);  // 通道3(上桥臂C相)
  37.     std_tim_output_compare_init(TIM1, &output_init, TIM_CHANNEL_4);  // 通道4(用于触发ADC)

  38.     /* 设置初始比较值(对应原代码ATIM_SetCompare1~4) */
  39.     std_tim_set_ccx_value(TIM1, TIM_CHANNEL_1, 0);               // 通道1初始占空比0
  40.     std_tim_set_ccx_value(TIM1, TIM_CHANNEL_2, 0);               // 通道2初始占空比0
  41.     std_tim_set_ccx_value(TIM1, TIM_CHANNEL_3, 0);               // 通道3初始占空比0
  42.     std_tim_set_ccx_value(TIM1, TIM_CHANNEL_4, PWM_PERIOD / 2);   // 通道4比较值=周期的1/2(触发ADC)

  43.     /* 配置断路功能(对应原代码未显式配置的安全功能,保持最小配置) */
  44.     break_config.off_state_run_mode = TIM_OSSR_DISABLE;    // 运行模式关闭状态禁用
  45.     break_config.off_state_idle_mode = TIM_OSSI_DISABLE;   // 空闲模式关闭状态禁用
  46.     break_config.dead_time = 0;                            // 死区时间=0
  47.     break_config.break_state = TIM_BREAK_DISABLE;          // 禁用断路功能
  48.     break_config.lock_level = TIM_LOCK_LEVEL_OFF;          // 无锁定级别
  49.     std_tim_bdt_init(TIM1, &break_config);
  50.        
  51. }

回答 +关注
人浏览 人回答问题 分享 举报
个回答

您需要登录后才可以回复 登录 | 注册