初级会员

- 积分
- 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");
}
|
|