舵機和超聲波沖突了,應該怎么設置呀,定時器2.3用于編碼器測速了
單片機源程序如下:
- #include "moto.h"
- #include "usart.h"
- #include "delay.h"
- #include "pwm.h"
- /***************** *********************************************************
- 函數功能:舵機PWM以及定時中斷初始化
- 入口參數:入口參數:arr:自動重裝值 psc:時鐘預分頻數
- 返回 值:無
- **************************************************************************/
- uint16_t count;
- void TRIG_Init(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
- /*TRIG 觸發信號 PB14*/
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//引腳14
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //復用推挽輸出模式,定時器功能為A0引腳復用功能
- 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; //復用推挽輸出
- 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; //設定計數器自動重裝值
- TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //設定預分頻器
- TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式
- TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; //設置時鐘分割
- 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; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設置輸出極性
- TIM_OC1Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數
-
- TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
- TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStruct.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設置輸出極性
- TIM_OC2Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數
-
- TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
- TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStruct.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設置輸出極性
- TIM_OC3Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數
-
- TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //選擇PWM1模式
- TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
- TIM_OCInitStruct.TIM_Pulse = 0; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設置輸出極性
- TIM_OC4Init(TIM4,&TIM_OCInitStruct); //初始化輸出比較參數
-
- TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH1使能預裝載寄存器
- TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH2使能預裝載寄存器
- TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH3使能預裝載寄存器
- TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable); //CH4使能預裝載寄存器
-
- TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIM4在ARR上的預裝載寄存器
-
- TIM_Cmd(TIM4,ENABLE); //使能定時器4
- }
- /***************** *********************************************************
- 函數功能:舵機PWM以及定時中斷初始化
- 入口參數:入口參數:arr:自動重裝值 psc:時鐘預分頻數
- 返回 值:無
- **************************************************************************/
- 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; //定義一個定時器捕獲輸入初始化的結構體
- //
- 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; //復用推挽輸出
- 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; //設置為浮空輸入
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //定義該引腳輸出速度為50MHZ
- GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化引腳GPIOA0
-
-
- TIM_TimeBaseInitStruct.TIM_Period = arr; //設定計數器自動重裝值
- TIM_TimeBaseInitStruct.TIM_Prescaler = psc; //設定預分頻器
- TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式
- TIM_TimeBaseInitStruct.TIM_ClockDivision = 0; //設置時鐘分割
- 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; //搶占優先級1
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //響應優先級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; //設置待裝入捕獲比較寄存器的脈沖值
- TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //設置輸出極性
- TIM_OC4Init(TIM1,&TIM_OCInitStruct); //初始化輸出比較參數
-
- TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預裝載寄存器
- TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預裝載寄存器
- TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預裝載寄存器
- TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable); //CH4使能預裝載寄存器
-
- TIM_CtrlPWMOutputs(TIM1,ENABLE); //高級定時器輸出需要設置這句
-
- TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1在ARR上的預裝載寄存器
- 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); //關閉定時器
- TIM1->CCR1=0; //TIM3的計數器清零
- 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); //關閉定時器
- time = TIM_GetCounter(TIM1); //獲取 TIM2 計數值; //獲取 TIM2 計數值
- distance = (time + count*1000)/58.0; //通過回響信號計算距離
- sum = distance + sum; //將五次結果相加
- TIM1->CCR1 = 0; //將TIM2計數寄存器的計數值清零
- count = 0; //中斷溢出次數清零
- delay_ms(10);
- }
- distance = (sum/5); //取5次的平均值
- printf("%d \n",distance);
-
- }
- void TIM1_UP_IRQHandler(void) { //中斷函數
- if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) {
- TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除中斷標志
- count++;
- }
- }
復制代碼
|