中级会员
 
- 积分
- 400
- 金钱
- 400
- 注册时间
- 2011-11-23
- 在线时间
- 0 小时
|
发表于 2012-8-4 22:36:13
|
显示全部楼层
回复【楼主位】天使翎翼:
---------------------------------
楼主来参考一下我的即可以了,自己输出一路PWM然后利用捕获相邻脉冲间的时间找打一点思路,剩下的如果自己慢慢研究一下,资料多看一下
void TIMx_ICx_Init(u16 arr,u16 psc)
{
RCC->APB2ENR |= 1<<2; //打开GPIOA口时钟
GPIOA->CRL &= 0XFFFFFFF0;
GPIOA->CRL |= 0X00000004; //GPIOA^0设置为浮空输入
GPIOA->ODR |= 1<<0; //输出高电平
RCC->APB2ENR |= 1<<0; //打开复用时钟
RCC->APB1ENR |= 1<<0; //打开TIM2时钟
TIM2->ARR = arr;
TIM2-> SC = psc;
// TIM2->SMCR |= 0X00D4;
TIM2->SMCR |= 1<<7; //打开主从模式
TIM2->SMCR |= 5<<4; //滤波后的定时器输入 TI1FP1
TIM2->SMCR |= 4<<0; //使用从模式的复位模式
TIM2->CCMR1 |= 1<<0; //CC1映射在TI1上
TIM2->CCMR1 |= 0<<2; //无分频
TIM2->CCMR1 |= 3<<4; //无数字滤波
TIM2->CCER &= ~(1<<1); //CC1捕获极性为上跳沿
TIM2->CCER |= 1<<0; //允许CC1捕获值放入CCR1中
TIM2->DIER|= 1<<1; //允许CC1捕获产生中断
TIM2->CR1 |= 1<<0; //打开定时器2
MY_NVIC_Init(1,0,TIM2_IRQChannel,2);//设置中断
}
//定时器2中断服务程序
void TIM2_IRQHandler(void)
{
static u16 i;
static u16 t;
i++;
t += (TIM2->CCR1)/100; //十次采样取平均值
if(i==100)
{
//printf("%d\t %d \n",t,1000000/t);
LCD_ShowNum(150,130,t,5,16); //显示一个数字
LED0 = !LED0;
i=0;t=0;
}
TIM2->SR &= ~(1<<1);//清除CC1中断标志位
} |
|