搜索
bottom↓
回复: 69

STM32F407 精确控制PWM 脉冲 输出个数

  [复制链接]

出0入0汤圆

发表于 2012-12-1 10:56:17 | 显示全部楼层 |阅读模式
本帖最后由 pilihuo81 于 2012-12-1 11:00 编辑

说明:
使用定时器TIM2 控制定时器TIM1 1kHz 精确控制输出脉冲个数
通过TIM1 输出占空比调整脉冲个数 本人控制是 1---9999个

//******************************************************************************
  TIM_DeInit(TIM2); //时钟为:84MHz
  /* TIM2 Base configuration */
  TIM_TimeBaseStructure.TIM_Period=20000-1;                 //
  TIM_TimeBaseStructure.TIM_Prescaler=42000-1;
  TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//TIM_CKD_DIV1; //采样分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  TIM_ARRPreloadConfig(TIM2, DISABLE);//禁止ARR预装载缓冲器

  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;                         //
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//Disable;//Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_Pulse =20000-(welding_time*2);//0;//TimerPeriod/2;//0;//Channel1Pulse;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//High;//Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;//;//Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);

  TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC1Ref); //选择触发输出为OC1
  /* TIM Interrupts enable */
  TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//TIM_IT_CC1,ENABLE);  
  TIM_Cmd(TIM2, ENABLE);        //开启时钟
/****TIM1  For PWM output *********************************/
  TIM_DeInit(TIM1); //时钟为:168MHz
/* TIM1 Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 42-1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
  TIM_TimeBaseStructure.TIM_Period = 2000-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Channel_1 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_Pulse = 20*(100-duty_cycle);
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//High;//  Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);  
  TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Disable);
  
/* Channel_2 Configuration in PWM mode */
  //TIM_OCInitStructure.TIM_Pulse = 20*(duty_cycle);
  //TIM_OC2Init(TIM1, &TIM_OCInitStructure);
/* Channel_3 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_Pulse = 20*(duty_cycle);
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//High;
  TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);
  TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Disable);
  
  TIM1->CCMR1=0x60;
  TIM1->CCMR2=0x60;
  /////TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);
  /////TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Enable);
  TIM_ITRxExternalClockConfig(TIM1, TIM_TS_ITR1);//外部时钟模式1,触发源为TIMER2
  TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Gated);//配置为门控模式,时钟自动切换为内部时钟
/* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);
/* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, DISABLE);
//************************************************************************  
//******************************************************************************
  TIM_DeInit(TIM7); //时钟为:84MHz
  /* TIM7 Time base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = 82340;//42000;//82340;//42000-1;//82340;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period =5-1;;// 25-1;//2000-1;//5-1;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter  =0;
  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
  TIM_UpdateRequestConfig(TIM7,TIM_UpdateSource_Regular);
/* Clear TIM7 Updata_Interrupts Bit */
  TIM_ClearITPendingBit(TIM7, TIM_IT_Update);
  /* TIM7 Updata_Interrupts enable */
  //TIM_ITConfig(TIM7,TIM_IT_Update, ENABLE);
  TIM_ITConfig(TIM7,TIM_IT_Update, ENABLE);
  /* TIM7 enable counter */
  TIM_Cmd(TIM7, ENABLE);

使能控制

void EXTI0_IRQHandler(void)
{
  TIM_Cmd(TIM7, ENABLE);
  //tim7delay_ms(50);
  ///TIM_ITConfig(TIM7,TIM_IT_Update, ENABLE);
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    /* Clear the EXTI line 0 pending bit */
    //TIM_Cmd(TIM7, ENABLE);
    //EXTI_ClearITPendingBit(EXTI_Line0);
    tim7delay_ms(30);
    if(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0))
    {
      if(weld_Enable==1)
      {
        TIM1->CCMR1=0x60;
        TIM1->CCMR2=0x60;     
        TIM1->CNT=20*(100-duty_cycle)-100;//100;//1800;      20*(100-duty_cycle)-100
        TIM2->CNT=19999-(welding_time)*2;      
        //TIM_Cmd(TIM3, ENABLE);        //开启时钟      
        //TIM_Cmd(TIM2, ENABLE);        //开启时钟  
        TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Enable);      
        TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Enable);
        /* Main Output Enable */
        TIM_CtrlPWMOutputs(TIM1, ENABLE);
        TIM_CCxCmd(TIM2,TIM_Channel_1,TIM_CCx_Enable);
        //TIM_ITConfig(TIM7,TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM7, ENABLE);   
        if(welding_time==9999)
        {
          welding_time7=welding_time-2;
        }
        else if(welding_time<9999)
        {
          welding_time7=welding_time;
        }
        tim7delay_ms(welding_time7);  
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        weld_Enable=0;
        if(flag1==0)      
        {      
          GPIO_SetBits(GPIOD, GPIO_Pin_12);        
          GPIO_ResetBits(GPIOD, GPIO_Pin_13);   
        }   
        else   
        {      
          GPIO_ResetBits(GPIOD, GPIO_Pin_12);      
          GPIO_SetBits(GPIOD, GPIO_Pin_13);     
        }     
        if(flag1==0)     
        {      
          flag1=1;     
        }      
        else if(flag1==1)      
        {      
          flag1=0;      
        }   
      }
    }
    /* Clear the EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}


结束控制
void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  {
    TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);
    /* Main Output Disable */
    TIM_CtrlPWMOutputs(TIM1, DISABLE);
    TIM_ForcedOC1Config(TIM1,TIM_ForcedAction_Active);
    TIM_ForcedOC3Config(TIM1,TIM_ForcedAction_InActive);
    TIM_CCxCmd(TIM1,TIM_Channel_1,TIM_CCx_Disable);
    TIM_CCxCmd(TIM1,TIM_Channel_3,TIM_CCx_Disable);
    TIM_CCxCmd(TIM2,TIM_Channel_1,TIM_CCx_Disable);
    TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    weld_Enable=1;
  }
  
}

出0入0汤圆

 楼主| 发表于 2012-12-1 11:00:48 | 显示全部楼层
控制脉冲数上有点小误差 大约是1个脉冲数

出0入0汤圆

发表于 2012-12-2 12:00:02 | 显示全部楼层
很好的学习参考方法,谢谢分享!

出0入0汤圆

发表于 2012-12-2 14:40:33 | 显示全部楼层
谢谢分享,正弄类似的!!!!

出0入0汤圆

发表于 2013-1-2 22:17:34 | 显示全部楼层
mark一下,过段时间在103上测试下。

出0入0汤圆

发表于 2013-1-2 22:23:55 | 显示全部楼层
参数太低了,用在某些场合不实用。。。

出0入0汤圆

发表于 2013-1-3 10:59:03 | 显示全部楼层
1K有点慢了,100k的话才有意义!

出0入0汤圆

发表于 2013-1-3 12:13:17 | 显示全部楼层
印象中要精确的话,应该用DMA来控制吧,把需要的波形占空比存一个大数组里,然后用DMA传入TIM,TIM每发一个脉冲DMA自动写入下一个占空比
这个方法我是在一个开源的STM8 SWIM烧写器里看到的

出0入0汤圆

发表于 2013-1-3 18:53:46 | 显示全部楼层
lotsbiss 发表于 2013-1-3 12:13
印象中要精确的话,应该用DMA来控制吧,把需要的波形占空比存一个大数组里,然后用DMA传入TIM,TIM每发一个 ...

这要是9999个脉冲就太蛋疼了
等占空比的话可以定时器A输出,同时触发定时器B,然后定时器B的Top设到9999,用B的DMA来写A的控制寄存器

出0入0汤圆

 楼主| 发表于 2013-1-4 09:19:17 | 显示全部楼层
lotsbiss 发表于 2013-1-3 12:13
印象中要精确的话,应该用DMA来控制吧,把需要的波形占空比存一个大数组里,然后用DMA传入TIM,TIM每发一个 ...

兄弟你说的这个我还真不了解  大家可以一起研究一下试试可是实现吗, 具体您说说怎么实现法

出0入0汤圆

 楼主| 发表于 2013-1-4 09:19:48 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-3 18:53
这要是9999个脉冲就太蛋疼了
等占空比的话可以定时器A输出,同时触发定时器B,然后定时器B的Top设到9999 ...

这个 您实现了吗??? 咱们可以一起研究一下具体实现效果如何
头像被屏蔽

出0入0汤圆

发表于 2013-1-4 12:06:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2013-1-4 13:23:46 来自手机 | 显示全部楼层
pilihuo81 发表于 2013-1-4 09:19
这个 您实现了吗??? 咱们可以一起研究一下具体实现效果如何

我倒是实现过8楼那个方法,那个还是挺直观,而且脉冲数很准。
程序不知道存下没有,回头找找。
9楼方法没做过,感觉应该对。

出0入0汤圆

发表于 2013-1-4 14:58:42 | 显示全部楼层
楼主说说实现的过程

出0入0汤圆

发表于 2013-1-4 15:09:09 | 显示全部楼层
nuc120的pwm 俺研究过,可以实现脉冲准确计数,可以调整脉冲宽度,理论可以实现大概最大到3m的脉冲。但由于使用中断占用cpu时间,具体,能做到几组。最高多少的频率就没有测试。

出0入0汤圆

 楼主| 发表于 2013-1-4 15:45:33 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-4 13:23
我倒是实现过8楼那个方法,那个还是挺直观,而且脉冲数很准。
程序不知道存下没有,回头找找。
9楼方法没 ...

您找找 看在stmF4 上可以实现不 我参考一下

出0入0汤圆

发表于 2013-1-4 16:30:12 | 显示全部楼层
pilihuo81 发表于 2013-1-4 15:45
您找找 看在stmF4 上可以实现不 我参考一下

程序应该是找不到了,当时是回答这个帖子时临时写的一个小程序:
http://www.amobbs.com/thread-5447073-1-1.html
等手边有示波器了我试试9楼说的

出0入0汤圆

发表于 2013-1-4 20:43:09 | 显示全部楼层
谢谢分享,学习一下~~~~~~~~~~~

出0入0汤圆

发表于 2013-1-5 12:12:05 | 显示全部楼层
pilihuo81 发表于 2013-1-4 15:45
您找找 看在stmF4 上可以实现不 我参考一下

嗯试出来了。目前72M的主频,输出3MHz的时候,脉冲数是准的;再高没有实验,可能会有困难。

这个是整个的配置函数,TIM3_Ch3是PWM输出,TIM4用来计脉冲数,DMA用来处理结束:

void TIM_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        DMA_InitTypeDef DMA_InitStructure;

        /* GPIOB clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);       

        /* TIM clock enable */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE);

        /* DMA clock enable */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        /* GPIOC: TIM3 ch3 as alternate function push-pull */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB, GPIO_InitStructure.GPIO_Pin);

        /* Time base 配置 */
        TIM_TimeBaseStructure.TIM_Period = 72 - 1;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        /* 设置TIM3通道3为PWM输出 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = TIM_Pulse_off;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
        TIM_OC3Init(TIM3, &TIM_OCInitStructure);
        TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

        TIM_ARRPreloadConfig(TIM3, ENABLE);
       
        /* 设置TIM3为主模式 */
        TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
        TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);

        /* Time base 配置 */
        TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
        TIM_TimeBaseStructure.TIM_Prescaler = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;

        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

        /* 设置TIM4为从模式 */
        TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Gated);
        TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);
  
        /* 使能TIM4更新DMA请求 */
        TIM_DMACmd(TIM4, TIM_DMA_Update, ENABLE);

        /* 开启TIM4 */
        TIM_Cmd(TIM4, ENABLE);
       
        /* 配置DMA1通道7 */
        DMA_DeInit(DMA1_Channel7);
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4000043C;        /* TIM3_CCR3 */
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)(&TIM_Pulse_off);
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_BufferSize = 1;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
       
        DMA_Init(DMA1_Channel7, &DMA_InitStructure);
       
        /* 开启TIM3 */
        TIM_Cmd(TIM3, ENABLE);
}

这个是输出脉冲的函数:

void Pulse_Generate(uint16_t count)
{
        /* 关闭TIM3 */
        TIM_Cmd(TIM3, DISABLE);
       
        /* 关闭DMA */
        DMA_Cmd(DMA1_Channel7, DISABLE);
       
        /* 设置脉冲数 */
        TIM_SetCounter(TIM4, count - 1);
       
        /* 设置占空比 */
        TIM_SetCounter(TIM3, TIM_Pulse_on);
        TIM_SetCompare3(TIM3, TIM_Pulse_on);
       
        /* 开启DMA */
        DMA1_Channel7->CNDTR = 1;
        DMA_Cmd(DMA1_Channel7, ENABLE);
       
        /* 开启TIM3 */
        TIM_Cmd(TIM3, ENABLE);
}

这里用PWM2模式,是为了在Pulse_Generate函数执行时立刻开始第一个脉冲,并且在最后一个脉冲结束后立刻启动DMA。

出0入0汤圆

发表于 2013-1-5 17:09:39 | 显示全部楼层
stm32f103上用定时器级联做这个pwm计数,做到了100k以上,具体差1个2个脉冲的情况,没有深究,应用上不需要那么精确

出0入0汤圆

 楼主| 发表于 2013-1-6 11:20:10 | 显示全部楼层
实验一下 看看结果

出0入0汤圆

 楼主| 发表于 2013-1-11 13:41:39 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-5 12:12
嗯试出来了。目前72M的主频,输出3MHz的时候,脉冲数是准的;再高没有实验,可能会有困难。

这个是整个 ...

兄弟你这个 我怎么在f4上实现不了那

出0入0汤圆

发表于 2013-1-11 15:52:01 | 显示全部楼层
pilihuo81 发表于 2013-1-11 13:41
兄弟你这个 我怎么在f4上实现不了那

哦 具体是什么问题?

出0入0汤圆

 楼主| 发表于 2013-1-15 08:52:31 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-11 15:52
哦 具体是什么问题?

不输出 波形啊

出0入0汤圆

 楼主| 发表于 2013-1-17 09:33:11 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-5 12:12
嗯试出来了。目前72M的主频,输出3MHz的时候,脉冲数是准的;再高没有实验,可能会有困难。

这个是整个 ...

兄弟 我在STM32F4上实验怎么不输出波形,控制不了精确输出波形数量那

出0入0汤圆

 楼主| 发表于 2013-1-17 09:34:07 | 显示全部楼层
Achin 发表于 2013-1-5 17:09
stm32f103上用定时器级联做这个pwm计数,做到了100k以上,具体差1个2个脉冲的情况,没有深究,应用上不需要 ...

级联 我实验过 可以 但是最后收尾的时候 的波形出现了一个尖峰 有的时候

出0入0汤圆

 楼主| 发表于 2013-1-21 09:38:47 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-5 12:12
嗯试出来了。目前72M的主频,输出3MHz的时候,脉冲数是准的;再高没有实验,可能会有困难。

这个是整个 ...

兄弟你这种方式 是能控制 但是不能重复使用,比如按键启动一次 再按键在启动一次 下一次第一个定时器一直跑着 停不下来

出0入0汤圆

发表于 2013-1-21 11:05:06 | 显示全部楼层
pilihuo81 发表于 2013-1-21 09:38
兄弟你这种方式 是能控制 但是不能重复使用,比如按键启动一次 再按键在启动一次 下一次第一个定时器一直 ...

可以去解决一下这个问题啊……我手上没有407的板子,对这个功能也没需求

出0入0汤圆

 楼主| 发表于 2013-1-21 14:51:03 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-21 11:05
可以去解决一下这个问题啊……我手上没有407的板子,对这个功能也没需求 ...

这个问题解决的办法 我想过 用中断 在传输完毕数据进入中断关闭这两个定时器

出0入0汤圆

发表于 2013-1-21 15:27:37 来自手机 | 显示全部楼层
pilihuo81 发表于 2013-1-21 14:51
这个问题解决的办法 我想过 用中断 在传输完毕数据进入中断关闭这两个定时器 ...

我感觉这个只是避开了问题…
用DMA的原因是减小掉进入中断的那部分时间…

出0入0汤圆

 楼主| 发表于 2013-1-22 08:23:31 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-21 15:27
我感觉这个只是避开了问题…
用DMA的原因是减小掉进入中断的那部分时间… ...

中断已经能关闭 这个 可以重复使用, 但是出现个问题  达不到我用的波形 同步,我把我波形发上来

出0入0汤圆

发表于 2013-1-24 09:31:04 | 显示全部楼层
MARK     

出0入0汤圆

发表于 2013-2-4 16:08:53 | 显示全部楼层
本帖最后由 153290557 于 2013-2-4 16:13 编辑

曾经F1实现过定量脉冲,2个定时器组成,完全硬件实现,速度有1MHZ,输出任意脉冲数,最大16位,输出任意 定时计数器计数的整数倍频率

出0入0汤圆

发表于 2013-5-18 19:16:47 | 显示全部楼层
感谢各位,保存备用。

出0入0汤圆

发表于 2013-5-29 10:59:33 | 显示全部楼层
pilihuo81 发表于 2013-1-22 08:23
中断已经能关闭 这个 可以重复使用, 但是出现个问题  达不到我用的波形 同步,我把我波形发上来 ...

哥们你最后实现了吗?我觉得这个功能很有用!!!

出0入0汤圆

发表于 2013-5-29 11:05:07 | 显示全部楼层
MARK,学习一下啦!

出0入0汤圆

发表于 2013-7-1 10:08:43 | 显示全部楼层
做得好,收藏研究

出0入0汤圆

发表于 2013-7-1 10:44:56 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2013-7-1 11:58:12 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-3 18:53
这要是9999个脉冲就太蛋疼了
等占空比的话可以定时器A输出,同时触发定时器B,然后定时器B的Top设到9999 ...

要是输出的占空比是固定的话,每次写入CCR的数也是固定的,DMA也有地址不增加模式的。。。。

出0入0汤圆

发表于 2013-7-4 17:04:08 来自手机 | 显示全部楼层
pilihuo81 发表于 2012-12-1 11:00
控制脉冲数上有点小误差 大约是1个脉冲数

有误差还说个屁啊,这玩意必须半个误差都没有,才有意义。

出0入0汤圆

发表于 2013-7-4 17:23:52 | 显示全部楼层

MARK,学习一下啦!

出0入0汤圆

 楼主| 发表于 2013-7-5 09:03:39 | 显示全部楼层
bitter_rain 发表于 2013-7-4 17:04
有误差还说个屁啊,这玩意必须半个误差都没有,才有意义。

现在已经调整到精确控制了 ,兄弟你也说话太那个什么啦把

出0入0汤圆

发表于 2013-7-6 22:30:49 | 显示全部楼层
pilihuo81 发表于 2013-7-5 09:03
现在已经调整到精确控制了 ,兄弟你也说话太那个什么啦把

不会吧,我这样的语气你都感觉不适应啊?
我可没有半点恶意的哦,只是表达了我认为这个东西一定要做到分秒不差的意思。

出0入0汤圆

发表于 2013-7-18 08:57:33 | 显示全部楼层
pilihuo81 发表于 2013-7-5 09:03
现在已经调整到精确控制了 ,兄弟你也说话太那个什么啦把

可否分享一下,我现在很可能需要用到这个,这样好像真的是伸手党了

出0入0汤圆

发表于 2013-7-18 12:54:40 | 显示全部楼层
必须要mark。

出0入0汤圆

发表于 2013-9-15 11:05:05 | 显示全部楼层
楼主你的问题最后解决了吗,用DMA方式的。我也在用407做,刚接触。能否把程序给俺看看,多谢多谢。479912215

出0入0汤圆

发表于 2013-9-15 11:36:19 | 显示全部楼层
高级计数器有重复计数的功能啊。

出0入0汤圆

发表于 2013-10-14 14:58:39 | 显示全部楼层
好贴。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

出0入0汤圆

发表于 2013-10-14 15:43:51 | 显示全部楼层
MARK

出0入0汤圆

发表于 2013-10-14 15:59:24 | 显示全部楼层
这个好东西,对控制步进马达最好了.

出0入0汤圆

发表于 2013-10-19 15:25:40 | 显示全部楼层
为了降低成本把DAC换成PWM,刚好需要用到,谢谢,回去慢慢学习一哈

出0入0汤圆

发表于 2013-10-19 16:24:18 | 显示全部楼层
LZ能否把修改后的经验分享下

出0入0汤圆

发表于 2013-10-19 23:11:16 | 显示全部楼层
bitter_rain 发表于 2013-7-4 17:04
有误差还说个屁啊,这玩意必须半个误差都没有,才有意义。

MASK你的头像

出0入0汤圆

发表于 2014-6-12 16:25:22 | 显示全部楼层
这个帖子必须顶,收藏先,等需要时再回头来研究

出0入0汤圆

发表于 2014-6-13 16:59:00 | 显示全部楼层
发脉冲CPLD很强大

出0入0汤圆

发表于 2014-6-17 11:30:53 | 显示全部楼层

mark

出0入0汤圆

发表于 2015-1-29 19:54:43 | 显示全部楼层
K.O.Carnivist 发表于 2013-1-5 12:12
嗯试出来了。目前72M的主频,输出3MHz的时候,脉冲数是准的;再高没有实验,可能会有困难。

这个是整个 ...

我想用stm32F407VG的一个定时器输出四路PWM脉冲个数为7,这个思路是什么样地啊急用,如果有类似的程序发到我邮箱952683526@qq.com

出0入0汤圆

发表于 2015-1-29 21:50:16 | 显示全部楼层
楼主能否发一下你的程序到我邮箱啊,完整的。952683526@qq.com

出0入0汤圆

发表于 2015-1-29 21:50:36 | 显示全部楼层
楼主能否发一下你的程序到我邮箱啊,完整的。952683526@qq.com

出0入0汤圆

发表于 2015-7-27 08:40:04 | 显示全部楼层
难道一定要两个定时器级联吗?

出0入20汤圆

发表于 2015-7-27 08:52:46 | 显示全部楼层
我发表过用DMA+GPIO+TIM精确输出脉冲个数的代码。不用定时器连级。现在产品运行很好!

出0入0汤圆

发表于 2015-7-27 09:31:35 | 显示全部楼层

出0入0汤圆

发表于 2015-7-27 10:27:21 | 显示全部楼层
mark一把,pwm脉冲计数。

出0入0汤圆

发表于 2015-7-31 11:50:05 | 显示全部楼层
低频的 估计还没有什么问题!要是发高频脉冲 你这个就不行了!

出0入0汤圆

发表于 2015-10-9 09:43:36 | 显示全部楼层
zhifeng 发表于 2013-1-4 15:09
nuc120的pwm 俺研究过,可以实现脉冲准确计数,可以调整脉冲宽度,理论可以实现大概最大到3m的脉冲。但由于 ...

能说说NUC120 是怎么实现的吗?

出0入0汤圆

发表于 2015-10-9 10:22:40 | 显示全部楼层
good idea. MARK..

出0入0汤圆

发表于 2016-7-6 13:21:34 | 显示全部楼层
学习借鉴了,谢谢!

出0入0汤圆

发表于 2016-7-7 10:47:25 | 显示全部楼层
刚好在想这方面的问题,谢谢。

出0入22汤圆

发表于 2016-7-7 11:00:09 | 显示全部楼层
pilihuo81 发表于 2013-1-4 09:19
这个 您实现了吗??? 咱们可以一起研究一下具体实现效果如何

ST的SVPWM 就是这样实现的。

还有一个专用的DMA寄存器。不光可以控制PWM的个数,还可以精确控制第几个脉冲的占空比。
不过好像只有T1,T8可以

出0入0汤圆

发表于 2016-7-13 17:27:39 | 显示全部楼层
比FPGA/CPLD复杂多了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 06:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表