久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機定時器1,舵機和超聲波沖突了,應該怎么設置呀?
[打印本頁]
作者:
哈哈你好1
時間:
2022-1-18 13:18
標題:
單片機定時器1,舵機和超聲波沖突了,應該怎么設置呀?
舵機和超聲波沖突了,應該怎么設置呀,定時器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++;
}
}
復制代碼
作者:
lkc8210
時間:
2022-1-18 17:48
舵機需要輸出穩定而連續的脈沖來維持角度
所以舵機的定時器不能停
但編碼器測速不用連續去量
可以借一下定時器來用
作者:
哈哈你好1
時間:
2022-1-18 18:34
lkc8210 發表于 2022-1-18 17:48
舵機需要輸出穩定而連續的脈沖來維持角度
所以舵機的定時器不能停
但編碼器測速不用連續去量
好的,那我就測一個輪子的速度就可以,謝謝呀
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩午夜
|
久久99精品久久久久婷婷
|
亚洲精品一二三区
|
欧美一区二区三区视频在线播放
|
国产91精品久久久久久久网曝门
|
日本成人中文字幕
|
中文字幕 在线观看
|
国产精品久久久久久久久久久免费看
|
黄色网址在线免费播放
|
国产福利小视频
|
天天射天天干
|
影音先锋中文字幕在线观看
|
久久久久久久久久久爱
|
东京久久
|
91精品国产综合久久久久久漫画
|
99热这里都是精品
|
国产一区二区影院
|
精品乱子伦一区二区三区
|
日韩av一区二区在线观看
|
国产午夜精品视频
|
蜜臀久久99精品久久久久久宅男
|
日韩中文字幕在线观看
|
久热精品在线
|
日韩在线免费视频
|
国产精品99
|
特级一级黄色片
|
成人在线观看黄
|
成人免费视频观看
|
亚洲 欧美 日韩 在线
|
久久久久国产一级毛片高清网站
|
www.久草
|
91原创视频
|
午夜免费视频
|
久草精品在线
|
国产精品欧美一区二区
|
精品一区二区在线观看
|
精品久久1
|
色综久久
|
亚洲成人免费观看
|
久国产
|
日日摸夜夜添夜夜添特色大片
|