光電傳感器有遮擋時,輸出高電平;無遮擋,輸出低電平,我們接受到一次低電平時,把這個脈沖加一,輪子上有編碼圈一圈可以讓脈沖累加20次,我用了2個定時器和兩個外部中斷,定時器分別用來仿PWM輸出和定時,外部中斷分別用來光電傳感器的輸出(輸出的高低電平會輸入到單片機的IO口)和按鍵輸入控制電機轉動,現在PWM輸出暫時可以不用管,定時器定時1ms秒,檢測是否接受到傳感器輸入脈沖,計時1S后將脈沖累計的值(該值設為num)num/20回傳我們的結果為每秒輪子所轉的圈數,將該結果每秒的轉速顯示到OLED上,當然,也可以自己稍微修改代碼用串口輸出并顯示,
下面來看測速用到的幾個代碼段
//觸發傳感器輸入
void INIT_GD(void) //Key0
{
GPIO_InitTypeDef GPIO_InitStruct; //結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //時鐘
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; //下拉
GPIO_Init(GPIOB, &GPIO_InitStruct);
}
//定時器4
void TIM4_inIt(void)
{
//結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
//配置中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM3通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //搶占優先級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子優先級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure); //配置
TIM_TimeBaseStructure.TIM_Period = 999; //重裝載暫存器
TIM_TimeBaseStructure.TIM_Prescaler =71; //預分頻
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM4向上計數
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //配置 TIM4
TIM_Cmd(TIM4, ENABLE); //使能
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //開啟定時器4,
//進入一次中斷1Ms
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //1ms
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update );
time++;
//測每秒的轉速,每一秒更新一次
if(Key0 == 1)
flag=1;
if(Key0==0 && flag==1)
{
flag=0; //清除標志
num=num+1; //傳感器觸發次數
}
if(time == 1000) //計時1S,計算轉速
{
Circle=num/20; //轉速
time=0;
num=0;
}
}
}
詳細代碼鏈智能小車基于STM32的測速,親測
https://blog.csdn.net/m0_54195456/article/details/121042194
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342303.html
標籤:其他
