OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6700|回复: 3

关于普通定时器PWM输入若干问题

[复制链接]

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-9-18
在线时间
0 小时
发表于 2012-11-14 15:38:35 | 显示全部楼层 |阅读模式
 TIM1输出四路PWM刚刚实现了,现在着手用TIM3和TIM4实现8路PWM输入捕获,能实现吗?谁有例程,可或借小弟参考一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-11-14 18:12:07 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-9-18
在线时间
0 小时
 楼主| 发表于 2012-11-14 21:07:30 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
今天参照人家的程序写了如下代码,用串口调式助手,打印不出来IC1\IC2\IC3\IC4的值,输入的PWM波形50HZ的,我主要的想法是只测脉宽,输入的PWM的频率是已知的,就是50HZ,原子哥有时间帮忙给看看。谢谢
#include "buhuo.h"
#include "sys.h"
#include "usart.h"
#include "stdio.h"
#include "delay.h"
int main(void)
{  
    Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
uart_init(72,9600);  //串口初始化 
   Capture_Init(10000,71);
  

   
}


#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "buhuo.h"
u16 IC1Value;//ch1通道脉宽测量值
u16 IC2Value;//ch2通道脉宽测量值
u16 IC3Value;//ch3通道脉宽测量值
u16 IC4Value;//ch4通道脉宽测量值
//********************************************************************************************
//* 输入捕获初始化函数
//* 传入参数: arr 输入计数器的最大值,psc 输入每计一个数的时间为(系统时钟/(psc+1))
//* 返回值: 无
void SystemInit (void){}
void Capture_Init(u16 arr,u16 psc)
{
   RCC->APB2ENR|=1<<0; //辅助时钟使能
   RCC->APB2ENR|=1<<3; //PB时钟使能
   RCC->APB1ENR|=1<<2; //TIM4时钟使能
   TIM4->ARR=arr;      //设定计数器自动装载值
   TIM4->SC=psc;      //预分频器
   GPIOB->CRL&=0X00FFFFFF;
   GPIOB->CRL|=0X44000000;
   GPIOB->CRH&=0XFFFFFF00;
   GPIOB->CRH|=0X00000044;//设置PB6\7\8\9为浮空输入
   GPIOB->ODR&=~(15<<6); //设置PB6\7\8\9下拉
   TIM4->CCMR1|=1<<0; //CC1通道设置为输入模式映射到TI1
   TIM4->CCMR1|=1<<8;//CC2通道设置为输入模式映射到TI2
   TIM4->CCMR2|=1<<0;//CC3通道设置为输入模式映射到TI3
   TIM4->CCMR2|=1<<8;//CC4通道设置为输入模式映射到TI4
   TIM4->CCMR1|=3<<4;//配置CC1滤波器
   TIM4->CCMR1|=3<<12;//配置CC2滤波器
   TIM4->CCMR2|=3<<4;//配置CC3滤波器
   TIM4->CCMR2|=3<<12;//配置CC4滤波器
   TIM4->CCER|=1<<1;//捕获发生在CC1的下降沿
   TIM4->CCER|=1<<5;//捕获发生在CC2的下降沿
   TIM4->CCER|=1<<9;//捕获发生在CC3的下降沿
   TIM4->CCER|=1<<13;//捕获发生在CC4的下降沿
//   TIM4->CCER|=1<<1;//1通道选择上升沿有效
//   TIM4->CCER&=~(1<<5);//2通道选择下降沿有效
   TIM4->CCMR1&=~(1<<2);//CC1通道不分频
   TIM4->CCMR1&=~(1<<10);//CC2通道不分频
   TIM4->CCMR2&=~(1<<2);//CC3通道不分频
   TIM4->CCMR2&=~(1<<10);//CC4通道不分频
   //TIM4->SMCR|=5<<4;//TS=101
   //TIM4->SMCR|=4<<0;//选择复位模式

   TIM4->CCER|=1<<0;//允许1通道捕获计数器的值到捕获寄存器
   TIM4->CCER|=1<<4;//允许2通道捕获计数器的值到捕获寄存器
   TIM4->CCER|=1<<8;//允许3通道捕获计数器的值到捕获寄存器
   TIM4->CCER|=1<<12;//允许4通道捕获计数器的值到捕获寄存器
   TIM4->DIER|=1<<1;//允许1通道更新捕获中断
   TIM4->DIER|=1<<2;//允许2通道更新捕获中断
   TIM4->DIER|=1<<3;//允许3通道更新捕获中断
   TIM4->DIER|=1<<4;//允许4通道更新捕获中断
   TIM4->CR1|=0x01;//使能定时器4
   MY_NVIC_Init(2,3,TIM4_IRQChannel,2);
}
//********************************************************************************************
//* 输入捕获中断函数
//* 传入参数: 无
//* 返回值: 无
void TIM4_IRQHandler(void)
{
   IC1Value=TIM4->CCR1;//读取通道1中的数据
     printf("IC1Value=%d\r\n");
   IC2Value=TIM4->CCR2;//读取通道2中的数据
     printf("IC2Value=%d\r\n");
   IC3Value=TIM4->CCR3;//读取通道3中的数据
     printf("IC3Value=%d\r\n");
   IC4Value=TIM4->CCR4;//读取通道4中的数据
     printf("IC4Value=%d\r\n");
   
}
回复 支持 反对

使用道具 举报

7

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2012-9-18
在线时间
0 小时
 楼主| 发表于 2012-11-14 21:26:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
打印出来了,发现完全是一个错误的代码,没有输入的时候各个IC也有数值读出。继续努力
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-18 22:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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