PWM发脉冲怎么精确控制发脉冲的个数呢.docx

上传人:b****2 文档编号:1705111 上传时间:2022-10-23 格式:DOCX 页数:11 大小:441.28KB
下载 相关 举报
PWM发脉冲怎么精确控制发脉冲的个数呢.docx_第1页
第1页 / 共11页
PWM发脉冲怎么精确控制发脉冲的个数呢.docx_第2页
第2页 / 共11页
PWM发脉冲怎么精确控制发脉冲的个数呢.docx_第3页
第3页 / 共11页
PWM发脉冲怎么精确控制发脉冲的个数呢.docx_第4页
第4页 / 共11页
PWM发脉冲怎么精确控制发脉冲的个数呢.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

PWM发脉冲怎么精确控制发脉冲的个数呢.docx

《PWM发脉冲怎么精确控制发脉冲的个数呢.docx》由会员分享,可在线阅读,更多相关《PWM发脉冲怎么精确控制发脉冲的个数呢.docx(11页珍藏版)》请在冰豆网上搜索。

PWM发脉冲怎么精确控制发脉冲的个数呢.docx

PWM发脉冲怎么精确控制发脉冲的个数呢

PWM发脉冲-怎么精确控制发脉冲的个数呢

STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。

具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受

该怎么控制呢?

1.接上一个外部中断口,在中断中计数

2.用一个定时器对发脉冲的时间进行控制

各位大侠还有什么好的办法吗?

求解啊!

PWM溢出中断计数,是个不错的解决办法。

如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了

开启PWM输出的溢出中断,进入一次中断,就是一个波

 

原子哥 是这里吗?

设置这个寄存器

 

或者只是简单的定时器溢出中断

oid TIM3_IRQHandler(void)

{

  if(TIM3->SR&0X0001)//溢出中断

  {

     ....     //计数

  }

  TIM3->SR&=~(1<<0);//清除中断标志位

}

看我们开发板:

定时器中断例程。

 

你好  原子哥    中断计数的话  那怎么停止呢    还有停止了还想让他循环发送呢    

有没有实现好的源程序呢   我是STM32F103

 

控制输出方波的脉冲数和周期

好多人遇到这个问题,额!

现在我用了两种方法实现,感觉都不好!

 方案1:

定时器翻转IO,到达指定个数关闭TIM

方案2:

PWM,开启比较捕获中断,到达指定个数关闭TIM

感觉都是频繁进中断,占用大量CPU资源。

不能做其他事了

voidTIM4_GPIO_Config(void)

{

  GPIO_InitTypeDefGPIO_InitStructure;

 

    /*TIM4clockenable*/

    //PCLK1经过2倍频后作为TIM4的时钟源等于72MHz

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);

 NVIC_Configuration

(1);

 

  /*GPIOBclockenable*/

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);

 

  /*GPIOBConfiguration:

TIM4channel1and2asalternatefunctionpush-pull*/

  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;          //复用推挽输出

  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

  GPIO_Init(GPIOB,&GPIO_InitStructure);

  GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);

}

 

 

voidTim2_Slave_Init(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_DeInit(TIM2);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

    NVIC_Configuration(8);

        TIM_TimeBaseStructure.TIM_Period=XBUF[1]-1;

    TIM_TimeBaseStructure.TIM_Prescaler=0;        //时钟预分频数

    TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

 

    TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4

    TIM_InternalClockConfig(TIM2);

    TIM2->SMCR|= 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);//是否开启时钟(开启后每发送一个脉冲,定时器加一)

 

 

}

 

voidTim3_Slave_Init(void)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_DeInit(TIM3);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

    NVIC_Configuration(9);

 

    TIM_TimeBaseStructure.TIM_Period=XBUF[3]-1;

    TIM_TimeBaseStructure.TIM_Prescaler=0;        //时钟预分频数

    TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出

    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

 

    TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4

    TIM_InternalClockConfig(TIM3);

    TIM3->SMCR|= 0x0007;//设定从模式控制寄存器,外部时钟模式1上升沿驱动计数

     

    //TIM_UpdateDisableConfig(TIM4,ENABLE);

    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信号的模式,如周期、极性、占空比

 *输入 :

 *输出 :

 *调用 :

内部调用

 */

voidTIM4_PWM_Init(u16T)

{

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

    u16CCR1_Val=(T+1)/2;

    u16CCR2_Val=(T+1)/2;

    u16CCR3_Val=(T+1)/2;

    u16CCR4_Val=(T+1)/2;

  /*-----------------------------------------------------------------------

    TIM1Configuration:

generate4PWMsignalswith4differentdutycycles:

    TIM1CLK=36MHz,Prescaler=0x0,TIM1counterclock=36MHz

    TIM1ARRRegister=999=>TIM1Frequency=TIM1counterclock/(ARR+1)

    TIM1Frequency=36KHz.

    TIM1Channel1dutycycle=(TIM1_CCR1/TIM1_ARR)*100=50%

    TIM1Channel2dutycycle=(TIM1_CCR2/TIM1_ARR)*100=50%

    TIM1Channel3dutycycle=(TIM1_CCR3/TIM1_ARR)*100=50%

    TIM1Channel4dutycycle=(TIM1_CCR4/TIM1_ARR)*100=50%

  -----------------------------------------------------------------------*/

 

  /*Timebaseconfiguration*/

  TIM_TimeBaseStructure.TIM_Period=T-1;//Tus

  TIM_TimeBaseStructure.TIM_Prescaler=72-1;

  TIM_TimeBaseStructure.TIM_ClockDivision=0;

  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

 

  TIM4->CR1&=((u16)0x03FD);//UDISenable

 

  /*PWM1Modeconfiguration:

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