1、PWM发脉冲怎么精确控制发脉冲的个数呢PWM发脉冲-怎么精确控制发脉冲的个数呢STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受该怎么控制呢?1.接上一个外部中断口,在中断中计数2.用一个定时器 对发脉冲的时间进行控制各位大侠还有什么好的办法吗?求解啊!PWM溢出中断计数,是个不错的解决办法。如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了开启PWM输出的溢出中断,进入一次中断,就是一个波原子哥 是这里吗? 设置这个寄存器或者只是简单的定时器溢出中断
2、 oidTIM3_IRQHandler(void) if(TIM3-SR&0X0001)/溢出中断 ./计数 TIM3-SR&=(1SMCR |= 0x0007;/设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数/TIM_UpdateDisableConfig(TIM4,ENABLE);TIM_ARRPreloadConfig(TIM2, ENABLE);TIM_ClearFlag(TIM2,TIM_FLAG_Update); /清除溢出中断标志TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);TIM_Cmd(TIM2,ENABLE);/是否开启时钟(开启后每
3、发送一个脉冲,定时器加一)void Tim3_Slave_Init(void)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_DeInit(TIM3);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);NVIC_Configuration(9);TIM_TimeBaseStructure.TIM_Period= XBUF3 - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; /时钟预分频数TIM_TimeBaseStructure.TIM_ClockD
4、ivision=0; /采样分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);/选择TIM2的输入触发源 内部触发3 TIM4TIM_InternalClockConfig(TIM3);TIM3-SMCR |= 0x0007;/设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数/TIM_UpdateDisableConfig(TIM4,ENAB
5、LE);TIM_ARRPreloadConfig(TIM3, ENABLE);TIM_ClearFlag(TIM3,TIM_FLAG_Update); /清除溢出中断标志TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);TIM_Cmd(TIM3,ENABLE);/是否开启时钟(开启后每发送一个脉冲,定时器加一)/* 函数名:TIM4_Mode_Config* 描述 :配置TIM4输出的PWM信号的模式,如周期、极性、占空比* 输入 :无* 输出 :无* 调用 :内部调用*/void TIM4_PWM_Init(u16 T)TIM_TimeBaseInitTypeD
6、ef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;u16 CCR1_Val = (T+1)/2;u16 CCR2_Val = (T+1)/2;u16 CCR3_Val = (T+1)/2;u16 CCR4_Val = (T+1)/2;/* -TIM1 Configuration: generate 4 PWM signals with 4 different duty cycles:TIM1CLK = 36 MHz, Prescaler = 0x0, TIM1 counter clock = 36 MHzTIM1 AR
7、R Register = 999 = TIM1 Frequency = TIM1 counter clock/(ARR + 1)TIM1 Frequency = 36 KHz.TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 50%TIM1 Channel2 duty cycle = (TIM1_CCR2/ TIM1_ARR)* 100 = 50%TIM1 Channel3 duty cycle = (TIM1_CCR3/ TIM1_ARR)* 100 = 50%TIM1 Channel4 duty cycle = (TIM1_CC
8、R4/ TIM1_ARR)* 100 = 50%- */* Time base configuration */TIM_TimeBaseStructure.TIM_Period = T-1;/T usTIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM4-CR
9、1 &= (u16)0x03FD);/ UDIS enable/* PWM1 Mode configuration: Channel1 */TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = CCR1_Val;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OC1Init(TIM4, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);/* PWM1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1