////////////////////////////// tim.c 文件//////////////////////////////////////////
#include"stm32f10x_lib.h"
#include"sys.h"
#include"timer.h"
#include"usart.h"
void Capture_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<0; // AFIO
RCC->APB1ENR|=1<<2; //TIM4
RCC->APB2ENR|=1<<3; //PORTB
TIM4->ARR=arr; //自动装载
TIM4-> SC=psc; //预分频
GPIOA->CRL&=0XF0FFFFFF;//PB6
GPIOA->CRL|=0X04000000;//
GPIOA->ODR|=1<<6;//PB6
TIM4->CCMR1|=(1<<0);//IC1映射在TI1
TIM4->CCMR1|=(3<<4);
TIM4->CCER&=~(1<<1);//上升沿
TIM4->CCER|=(1<<0);
TIM4->DIER|=(1<<1);
TIM4->CR1|=0x01; //开启定时器
NVIC_init(2,3,2,TIM4_IRQChannel);//
}
/* */
void TIM4_IRQHandler(void)
{
u32 temp,temp1;
data = TIM4->CCR1;//记录数据
printf("当前值:%d\r\n",data);
if((TIM4->CCER&(1<<1))==0) //如果上次开启的是上升沿检测
{
temp1=data-last_data;
if(data>last_data)
{
printf("低电平时间:%d\r\n",temp1);
}
TIM4->CCER|=(1<<1); //开启下降沿
}
else //如果上次开启的是下降沿检测
{
temp=data-last_data;
if(data>last_data)
{
printf("高电平时间:%d\r\n",temp);
}
TIM4->CCER&=~(1<<1);//开启上升沿
}
TIM4->SR&=~(1<<1);//清除标志
last_data=data;
}
////////////////////////////////////pwm.c文件////////////////////////////////////////////
void PWM_init(u16 arr,u16 ccr,u16 psc)
{ //TIM5 CH1 PA0
RCC->APB1ENR|=(1<<3); //TIM5 CH1
RCC->APB2ENR|=(1<<0); //AFIO
RCC->APB2ENR|=(1<<2); //GPIOA
GPIOA->CRL&=0XFFFFFF0;
GPIOA->CRL|=0X000000B;//GPIOA0
GPIOA->ODR|=(1<<0);
TIM5-> SC=psc;
TIM5->ARR=arr;
TIM5->CCR1=ccr+1;
TIM5->CCMR1|=(1<<3);//输出比较1预装载使能
TIM5->CCMR1|=(6<<4);//PWM1
TIM5->CCER|=(1<<0);//使能输出
TIM5->CR1|=(1<<0);
}
/////////////////////////////////////////main.c文件 ///////////////////////////////////////////////
int main()
{
RCC_init(9);
LED_init();
TIM3_init(1000,35); //定时器3初始化 用来控制灯的亮灭
USART_init(19200); //Usart的初始化
PWM_init(6000,1000,7199); //产生指定频率,占空比的PWM
Capture_Init(40000,7199); //输入捕获初始化
while(1)
{
}
}
上面程序里为什么把 PWM_init(u16 arr,u16 ccr,u16 psc) l里的 arr, ccr ,psc数值取到某个值以后,输入捕获测得的高低电平就准,但是如果比这个值小的话,测得值就特别不准,这位是为啥呢?程序哪部分有问题?还望大家帮忙看一下
|