本帖最后由 地瓜patch 于 2025-3-30 20:28 编辑
在stm32F407的 PB8 配置定时器的PWM,输出 200us 的 高电 300us低电平。 又使用普通定时器模式创建一个 1.8KHz 波,占空比约为 35%。 在定时器中断处理程序中触发 PB0 上的 adc 转换。 它会持续运行一分钟以上,没有值。然后突然退出到第二个 for 循环,取得的ADC值大部分都无效。
#define ADC_ARRY_SIZE 30uint16_t adc_vals[ADC_ARRY_SIZE] = {0};
uint16_t adc_val = 0;
uint32_t adc_zero_count = 0;
uint32_t index_no = 0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
adc_val = HAL_ADC_GetValue(&hadc3);
if((adc_val != 0) && (index_no < ADC_ARRY_SIZE))
adc_vals[index_no++] = adc_val;
else if(adc_val == 0)
adc_zero_count++;
}
void set_pwm2_duty(uint32_t duty_count)
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, duty_count);
}
int main(void)
{
adc_val = 0;
adc_zero_count = 0;
index_no = 0;
adc_buffer_full = false;
int i;
//Generated code begin
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC3_Init();
MX_TIM2_Init();
MX_TIM6_Init();
//generated code end
set_laser_pwm_duty(3000);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOGPIOB, GPIO_PIN_8, GPIO_PIN_SET);
HAL_TIM_Base_Start_IT(&htim6);
//start pulse timer
adc_trigger = true;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(index_no >= 30)
break;
HAL_Delay(1);
}
HAL_TIM_Base_Stop(&htim6);
//start blink timer
HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);
HAL_ADC_Stop_IT(&hadc3);
for(i=0;i<ADC_ARRY_SIZE;i++)
ladc_vals = adc_vals;
for(;;);
}
|