论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-4-12 20:10:37
|
显示全部楼层
本帖最后由 likunxue 于 2016-4-12 20:13 编辑
用定时器的输入捕获模式 来实现
也可以用中断来实现, 方法很多的
可以参考以下代码, 只是部份, PB7接输入口
/*******************************************************************************************
函数名: 定时器4配置输入捕获模式
调 用: TIM4_IRD_StartWork_int(void)
参 数: 无
返回值: 无
*******************************************************************************************/
void TIM4_StartWork_int(void)
{
RCC->APB1ENR |= 1<<2; //使能定时器4时钟
RCC->APB2ENR |= 1<<3; //使能外设PORTB时钟
GPIOB->CRL &= 0x0fffffff; //PB7输入
GPIOB->CRL |= 0x40000000; //TIM4_CH2 ->PB7
GPIOB->ODR |= 1<<7; //置上拉
TIM4->ARR = 59999; //设定计数器自动装载值(100us)
TIM4->PSC = 36; //时钟分频系数36,计数频率为1MHZ
BIT_ADM(TIM4->CR1,7) = 1; //定时器ARPE充许
BIT_ADM(TIM4->CCMR1,15) = 0; //IC2F = 0100; N=6 配置输入捕获2滤波
BIT_ADM(TIM4->CCMR1,14) = 1;
BIT_ADM(TIM4->CCMR1,13) = 0;
BIT_ADM(TIM4->CCMR1,12) = 0;
BIT_ADM(TIM4->CCMR1,11) = 0; //IC2PSC = 00;不分频
BIT_ADM(TIM4->CCMR1,10) = 0;
BIT_ADM(TIM4->CCMR1, 9) = 0; //CC2S = 10;选择输入端口IC2映谢到 TI1上
BIT_ADM(TIM4->CCMR1, 8) = 1;
BIT_ADM(TIM4->CCER, 4) = 1; //OC2 输入捕获使能
BIT_ADM(TIM4->CCER, 5) = 0; //高电平有效P =0;
BIT_ADM(TIM4->DIER, 2) = 1; //充许捕获2中断
BIT_ADM(TIM4->DIER, 0) = 1; //定时器更新中断使能
MY_NVIC_Init(4,0,TIM4_IRQn,4); //抢占3,子优先级0,组4
BIT_ADM(TIM4->CR1,0) = 1; //使能定时器4
}
/*******************************************************************************************
函 数 名: 定时器4中断服务程序
功能说明: 计算当前电机的工作速度
形 参: width 脉冲宽度,单位 1us
返 回 值: 无
速度计算方法说明如下
采样频率 1MHZ(1us) F, 编码器线数 100线, M, 定时器的计数次数 S
频率(F) = 转数(N) * 线数(M)/60;
转数(N) = 频率(F) * 60/线数(M);
F = 1000000/S;
N = (1000000/S*60)/100;
MoB.STATUS; 速度检测被捕获标记
D7 = 1 加速,0 减速
D4 = 1 上升沿捕获标志位
D0~ D4 采样次数
********************************************************************************************/
void TIM4_IRQHandler(void)
{
if(BIT_ADM(TIM4->SR,0) == 1) //溢出中断
{
BIT_ADM(TIM4->SR,0) = 0; //清除溢出断标志
MoB.STATUS = 0; //清零脉宽记录寄存器
MoB.ShuChuMaiKuan = 0;
MoB.Leve = 0; //速度指针清零
}
if(BIT_ADM(TIM4->SR,2) == 1) //CC2IE中断
{
BIT_ADM(TIM4->SR,2) = 0; //清除CC2IE溢出中断
if(ENCODE_A == 1) //上升沿捕获
{
BIT_ADM(TIM4->CCER,5) = 1; //CC2P=1设置为下降沿捕获
TIM4->CNT = 0; //清空定时器值
MoB.STATUS |= 0x10; //标记上升沿已经被捕获
}
else{
u16 MaiKuan = TIM4->CCR2; //读取CCR2也可以清CC1IF标志位
BIT_ADM(TIM4->CCER, 5) = 0; //CC2P=0 设置为上升沿捕获
if(MoB.STATUS & 0x10) SuDuHuanChuLi(MaiKuan); //速度处理
}
}
TIM4->SR = 0;
} |
|