查看: 2364|回复: 5

[其他] PWM频率捕获

[复制链接]

该用户从未签到

26

主题

118

帖子

0

中级会员

Rank: 3Rank: 3

积分
417
最后登录
1970-1-1
发表于 2014-12-29 19:17:40 | 显示全部楼层 |阅读模式
哪位大神有相关历程,帮忙借鉴下呗
就是算出PWM的频率即可
谢谢


我知道答案 目前已有5人回答
回复

使用道具 举报

该用户从未签到

1

主题

802

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1763
最后登录
1970-1-1
发表于 2015-1-4 16:47:09 | 显示全部楼层
不知道对你有没有参考价值
#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h" //延时子函数
#include "usart.h"

u16   IC1Value;
u16   IC2Value;
u16   DutyCycle;
u16   Frequency;

void PWM_Init(u16 arr,u16 psc);
void Capture_Init(u16 arr,u16 psc);
int  main(void)
{
  Stm32_Clock_Init(9); //系统时钟设置
  delay_init(72);//延时函数初始化
  uart_init(72,9600);
  PWM_Init(1000,72-1);  //不分频。PWM频率=72000/1440=5Khz
  Capture_Init(2000,72-1);
  while(1)
  {
   Frequency = 1000000/IC1Value;
  DutyCycle = (IC2Value*100)/IC1Value;//占空比=(IC2Value/IC1Value)*100;
  printf("Frequency = %d\r\n",Frequency);
  printf("DutyCycle = %d\r\n",DutyCycle);
  printf("suqingxiao\r\n");
  }
}

//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void PWM_Init(u16 arr,u16 psc)
{         
//此部分需手动修改 IO口设置  
RCC->APB2ENR|=1<<0;    //  
RCC->APB1ENR|=1<<2;       //TIM4 时钟使能
RCC->APB2ENR|=1<<3;    //使能PORTB时钟
   
GPIOB->CRL&=0XF0FFFFFF;//PB6 输出  
GPIOB->CRL|=0X0B000000;//复用功能输出      
GPIOB->ODR|=1<<6;//PB6 上拉   
  
TIM4->ARR=arr;//设定计数器自动重装值   
TIM4->PSC=psc;//预分频器不分频

TIM4->CCMR1|=7<<4;  //CH1 PWM2模式      
TIM4->CCMR1|=1<<3; //CH1 预装载使能      
TIM4->CCER|=1<<0;  //OC1  输出使能      
TIM4->CR1=0x0080;  //ARPE使能  

TIM4->CR1|=0x01;    //使能定时器 3

TIM4->CCR1   = 500;  //占空比初值 =  1440*50% = 720                                       
}


void Capture_Init(u16 arr,u16 psc)
{
//此部分需手动修改 IO口设置  
RCC->APB2ENR|=1<<0;    //  
RCC->APB1ENR|=1<<0;       //TIM2 时钟使能
RCC->APB2ENR|=1<<2;    //使能PORTA时钟
   
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms   
TIM2->PSC=psc;  //预分频器,

GPIOA->CRL&=0XFFFFFFF0;//PA0 输出  
GPIOA->CRL|=0X00000004;//复用功能输出      
GPIOA->ODR|=1<<0;//PA0 上拉
   
TIM2->SMCR|=0x00D4;
//TIM2->SMCR|= 1<<5; //MSM=1 主/从模式
//TIM2->SMCR|= 5<<4; //TS=101 触发选择
//TIM2->SMCR|= 4<<0; //SMS=100 复位模式

TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端  
TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器
TIM2->CCER|=0<<1; //CC1P=0 选择有效转换边沿  上升沿有效
TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频
TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中


TIM2->CCMR1|=2<<8;//CC2S=10 选择输入端
TIM2->CCER|=1<<5; //CC2P=1 选择有交转换边沿 下降沿有效
TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中

TIM2->DIER|=1<<1;   //允许更新捕获中断   
     
TIM2->CR1|=0x01;    //使能定时器2
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2         
}

//定时器2中断服务程序  
void TIM2_IRQHandler(void)
{                  
IC1Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位
IC2Value = TIM2->CCR2;//读取CCR1也可以清CC2IF标志位                    
TIM2->SR&=~(1<<1);//清除中断标志位      
}
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2021-12-10 16:14
  • 签到天数: 1442 天

    连续签到: 1 天

    [LV.10]以坛为家III

    17

    主题

    3862

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8291
    最后登录
    2021-12-10
    发表于 2015-1-4 18:55:23 | 显示全部楼层
    不晓得这个对楼主是否有帮助

    http://www.lpld.cn/?p=360
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4614
    最后登录
    2021-1-25
    发表于 2015-1-4 22:04:32 | 显示全部楼层
    你可以在论坛里找类似的例子的,刚才看了下,有很多实例, 你可以去参考
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
    发表于 2015-1-4 22:38:25 | 显示全部楼层
    你可以使用DSP的脉冲捕捉功能啊!像MC56系列的单片机都有的,很丰富!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    26

    主题

    118

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    417
    最后登录
    1970-1-1
     楼主| 发表于 2015-1-12 19:27:53 | 显示全部楼层
    谢谢各位好心人,我已经搞定了   谢谢
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 13:27 , Processed in 0.099648 second(s), 26 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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