1、平台条件
1:硬件cc2541
2 通过霍尔传感器计算频率
利用外部io中断的,计算霍尔脚踏板的频率
主要思想:
1:一个边沿进来,就清除定时器的值并开始计数,:
2:下一个边沿进来,就读定时器的计数,并清除,再重新开始计数。
3:读出来的值就是周期。然后计算频率
2.1 外部中断引脚的设置
void hal_io_Init(void)
{
P2SEL &= ~(1 << 0); //P2.0设置为IO口
P2DIR &= ~(1 << 0); //P2.0设置为输入
P2INP &= ~(1 << 0); //P2.0上拉下拉模式
P2INP &= ~(1 << 7); //P2上拉
P2_0 = 1; //P2.0拉高
P2IFG &= ~(1 << 0); //初始化P2.0中断标志位
PICTL |= (1 << 3); //下降沿触发
P2IEN |= (1 << 0); //使能P2.0中断
IEN2 |= (1 << 1); //允许P口中断;
}
static uint32 P20_timer_cac = 0; // 定时器计数----、、、
static uint8 is_stop_P20_timer_fla = 1;// 1:表示停止 ,0表示正在开始定时器
//static uint8 P20_isr_times = 0;// 中断次数
uint8 frue_aa =0;
#pragma vector = P2INT_VECTOR
__interrupt void P2_ISR(void)
{
//p2.0 拉低-------
if(!(P2 & (1 << 0)) )
{
// 1: 计算频率--------
if(P20_timer_cac)
{
montor_dat.frequency = 1000/P20_timer_cac;
}
// step 2:重新清0,
P20_timer_cac =0;
// step 3: 定时器是否停止过,
if(is_stop_P20_timer_fla==1)
{
is_stop_P20_timer_fla =0;
//开始定时器循环
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_HAL_CYCLE, TIME_PORI );
}
if(motor_turn_sta!=2)
{
montor_dat.Turn_dir =1; // 正传
motor_turn_sta =1;
}
set_devie_on_sta ();
}
P2IFG = 0; //清中断标志
P2IF = 0; //清中断标志
P2IFG = 0; //清中断标志
P2IF = 0; //清中断标志
}
/**********************************************
*
* ------- 计算频率--------
*
******************************************/
void calcu_frequency_handle(void)
{
// 累加定时器变量
P20_timer_cac+=TIME_PORI;
// 2s //
// if(P20_timer_cac>(2000/50))
// {
// montor_dat.frequency = 0;
// is_stop_P20_timer_fla =1;
// osal_stop_timerEx( simpleBLEPeripheral_TaskID, SBP_HAL_CYCLE);
// }
}
可以加入QQ群:687360507
与大伙沟通交流,技术在于分享而进步