標(biāo)題:
單片機(jī)定時器1,舵機(jī)和超聲波沖突了,應(yīng)該怎么設(shè)置呀?
[打印本頁]
作者:
哈哈你好1
時間:
2022-1-18 13:18
標(biāo)題:
單片機(jī)定時器1,舵機(jī)和超聲波沖突了,應(yīng)該怎么設(shè)置呀?
舵機(jī)和超聲波沖突了,應(yīng)該怎么設(shè)置呀,定時器2.3用于編碼器測速了
單片機(jī)源程序如下:
#include "moto.h"
#include "usart.h"
#include "delay.h"
#include "pwm.h"
/***************** *********************************************************
函數(shù)功能:舵機(jī)PWM以及定時中斷初始化
入口參數(shù):入口參數(shù):arr:自動重裝值 psc:時鐘預(yù)分頻數(shù)
返回 值:無
**************************************************************************/
uint16_t count;
void TRIG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
/*TRIG 觸發(fā)信號 PB14*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//引腳14
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //復(fù)用推挽輸出模式,定時器功能為A0引腳復(fù)用功能
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //定義該引腳輸出速度為50MHZ
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引腳GPIOA0
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
void Motor_PWM_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //使能定時器4時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB的時鐘
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; //PB6 7 8 9
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Period = arr; //設(shè)定計數(shù)器自動重裝值
TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //設(shè)定預(yù)分頻器
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數(shù)模式
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; //設(shè)置時鐘分割
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct); //初始化定時器
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStruct.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出極性
TIM_OC1Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數(shù)
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStruct.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出極性
TIM_OC2Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數(shù)
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStruct.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出極性
TIM_OC3Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數(shù)
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStruct.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出極性
TIM_OC4Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數(shù)
TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH1使能預(yù)裝載寄存器
TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH2使能預(yù)裝載寄存器
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH3使能預(yù)裝載寄存器
TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH4使能預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIM4在ARR上的預(yù)裝載寄存器
TIM_Cmd(TIM4,ENABLE); //使能定時器4
}
/***************** *********************************************************
函數(shù)功能:舵機(jī)PWM以及定時中斷初始化
入口參數(shù):入口參數(shù):arr:自動重裝值 psc:時鐘預(yù)分頻數(shù)
返回 值:無
**************************************************************************/
void Servo_PWM_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
// TIM_ICInitTypeDef TIM3_ICInitStructure; //定義一個定時器捕獲輸入初始化的結(jié)構(gòu)體
//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //使能定時器1時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA的時鐘
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; //PA11
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
/*ECOH 回響信號 PB7*/
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;//引腳13
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //設(shè)置為浮空輸入
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //定義該引腳輸出速度為50MHZ
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化引腳GPIOA0
TIM_TimeBaseInitStruct.TIM_Period = arr; //設(shè)定計數(shù)器自動重裝值
TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //設(shè)定預(yù)分頻器
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數(shù)模式
TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; //設(shè)置時鐘分割
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct); //初始化定時器
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //使能定時器中斷
NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn; //使能外部中斷通道
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級1
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //響應(yīng)優(yōu)先級1
NVIC_Init(&NVIC_InitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStruct.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設(shè)置輸出極性
TIM_OC4Init(TIM1,&TIM_OCInitStruct); //初始化輸出比較參數(shù)
TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預(yù)裝載寄存器
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預(yù)裝載寄存器
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預(yù)裝載寄存器
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預(yù)裝載寄存器
TIM_CtrlPWMOutputs(TIM1,ENABLE); //高級定時器輸出需要設(shè)置這句
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1在ARR上的預(yù)裝載寄存器
TIM_ClearFlag(TIM1, TIM_FLAG_Update); // Clears the TIMx's pending flags.
// TIM1->CCR4=1400;
//
// TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許TIM1更新中斷|允許TIM1通道1捕獲中斷
TIM_Cmd(TIM1,ENABLE); //使能定時器1
}
void Count_Dist(void)
{
int distance = 0, sum = 0;
uint16_t time;
uint16_t i = 0;
delay_init(); //在 delay.h 中
TRIG_Init();
while(i < 5){
GPIO_SetBits(GPIOB, GPIO_Pin_12);
delay_us(20);
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
TIM_Cmd(TIM1,DISABLE); //關(guān)閉定時器
TIM1->CCR1=0; //TIM3的計數(shù)器清零
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);
TIM_Cmd(TIM1, ENABLE); //打開定時器
i += 1;
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1); //回響信號消失
TIM_Cmd(TIM1,DISABLE); //關(guān)閉定時器
time = TIM_GetCounter(TIM1); //獲取 TIM2 計數(shù)值; //獲取 TIM2 計數(shù)值
distance = (time + count*1000)/58.0; //通過回響信號計算距離
sum = distance + sum; //將五次結(jié)果相加
TIM1->CCR1 = 0; //將TIM2計數(shù)寄存器的計數(shù)值清零
count = 0; //中斷溢出次數(shù)清零
delay_ms(10);
}
distance = (sum/5); //取5次的平均值
printf("%d \n",distance);
}
void TIM1_UP_IRQHandler(void) { //中斷函數(shù)
if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) {
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除中斷標(biāo)志
count++;
}
}
復(fù)制代碼
作者:
lkc8210
時間:
2022-1-18 17:48
舵機(jī)需要輸出穩(wěn)定而連續(xù)的脈沖來維持角度
所以舵機(jī)的定時器不能停
但編碼器測速不用連續(xù)去量
可以借一下定時器來用
作者:
哈哈你好1
時間:
2022-1-18 18:34
lkc8210 發(fā)表于 2022-1-18 17:48
舵機(jī)需要輸出穩(wěn)定而連續(xù)的脈沖來維持角度
所以舵機(jī)的定時器不能停
但編碼器測速不用連續(xù)去量
好的,那我就測一個輪子的速度就可以,謝謝呀
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1