久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1912|回復: 2
打印 上一主題 下一主題
收起左側

單片機定時器1,舵機和超聲波沖突了,應該怎么設置呀?

[復制鏈接]
跳轉到指定樓層
樓主
ID:462324 發表于 2022-1-18 13:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
舵機和超聲波沖突了,應該怎么設置呀,定時器2.3用于編碼器測速了

單片機源程序如下:
  1. #include "moto.h"
  2. #include "usart.h"       
  3. #include "delay.h"
  4. #include "pwm.h"               
  5. /*****************   *********************************************************
  6. 函數功能:舵機PWM以及定時中斷初始化
  7. 入口參數:入口參數:arr:自動重裝值  psc:時鐘預分頻數
  8. 返回  值:無
  9. **************************************************************************/

  10. uint16_t count;

  11. void TRIG_Init(void)
  12. {

  13. GPIO_InitTypeDef  GPIO_InitStructure;
  14.        
  15. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口時鐘
  16.         /*TRIG 觸發信號 PB14*/
  17.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;//引腳14
  18.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //復用推挽輸出模式,定時器功能為A0引腳復用功能
  19.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //定義該引腳輸出速度為50MHZ
  20.   GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引腳GPIOA0
  21.          
  22.   GPIO_SetBits(GPIOB,GPIO_Pin_12);                                                 

  23. }

  24. void Motor_PWM_Init(u16 arr,u16 psc)        
  25. {
  26.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  27.         TIM_OCInitTypeDef TIM_OCInitStruct;
  28.   GPIO_InitTypeDef GPIO_InitStruct;                             
  29.        
  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);   //使能定時器4時鐘
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIOB的時鐘
  32.        
  33.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;          //復用推挽輸出
  34.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;   //PB6 7 8 9
  35.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  36.   GPIO_Init(GPIOB,&GPIO_InitStruct);
  37.        
  38.         TIM_TimeBaseInitStruct.TIM_Period = arr;              //設定計數器自動重裝值
  39.         TIM_TimeBaseInitStruct.TIM_Prescaler  = psc;          //設定預分頻器
  40.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式
  41.         TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;         //設置時鐘分割
  42.         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);       //初始化定時器
  43.        
  44.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //選擇PWM1模式
  45.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  46.         TIM_OCInitStruct.TIM_Pulse = 0;                            //設置待裝入捕獲比較寄存器的脈沖值
  47.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //設置輸出極性
  48.         TIM_OC1Init(TIM4,&TIM_OCInitStruct);                       //初始化輸出比較參數
  49.        
  50.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //選擇PWM1模式
  51.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  52.         TIM_OCInitStruct.TIM_Pulse = 0;                            //設置待裝入捕獲比較寄存器的脈沖值
  53.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //設置輸出極性
  54.         TIM_OC2Init(TIM4,&TIM_OCInitStruct);                       //初始化輸出比較參數
  55.        
  56.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //選擇PWM1模式
  57.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  58.         TIM_OCInitStruct.TIM_Pulse = 0;                            //設置待裝入捕獲比較寄存器的脈沖值
  59.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //設置輸出極性
  60.         TIM_OC3Init(TIM4,&TIM_OCInitStruct);                       //初始化輸出比較參數
  61.        
  62.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //選擇PWM1模式
  63.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  64.         TIM_OCInitStruct.TIM_Pulse = 0;                            //設置待裝入捕獲比較寄存器的脈沖值
  65.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //設置輸出極性
  66.         TIM_OC4Init(TIM4,&TIM_OCInitStruct);                       //初始化輸出比較參數
  67.        
  68.         TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH1使能預裝載寄存器
  69.         TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH2使能預裝載寄存器
  70.         TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH3使能預裝載寄存器
  71.         TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);   //CH4使能預裝載寄存器
  72.        
  73.         TIM_ARRPreloadConfig(TIM4, ENABLE);                //使能TIM4在ARR上的預裝載寄存器
  74.        
  75.         TIM_Cmd(TIM4,ENABLE);                              //使能定時器4
  76. }


  77. /*****************   *********************************************************
  78. 函數功能:舵機PWM以及定時中斷初始化
  79. 入口參數:入口參數:arr:自動重裝值  psc:時鐘預分頻數
  80. 返回  值:無
  81. **************************************************************************/
  82. void Servo_PWM_Init(u16 arr,u16 psc)
  83. {                        
  84.   TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
  85.         NVIC_InitTypeDef NVIC_InitStruct;
  86.         TIM_OCInitTypeDef TIM_OCInitStruct;
  87.   GPIO_InitTypeDef GPIO_InitStruct;  
  88. //        TIM_ICInitTypeDef  TIM3_ICInitStructure; //定義一個定時器捕獲輸入初始化的結構體       
  89. //       
  90.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);   //使能定時器1時鐘
  91.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);  //使能GPIOA的時鐘
  92.        
  93.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;          //復用推挽輸出
  94.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;                //PA11
  95.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  96.   GPIO_Init(GPIOA,&GPIO_InitStruct);
  97.        
  98.         /*ECOH 回響信號 PB7*/
  99.         GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;//引腳13
  100.         GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; //設置為浮空輸入
  101.         GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //定義該引腳輸出速度為50MHZ
  102.   GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化引腳GPIOA0
  103.          
  104.        
  105.         TIM_TimeBaseInitStruct.TIM_Period = arr;              //設定計數器自動重裝值
  106.         TIM_TimeBaseInitStruct.TIM_Prescaler  = psc;          //設定預分頻器
  107.         TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上計數模式
  108.         TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;         //設置時鐘分割
  109.         TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
  110.         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);       //初始化定時器
  111.        
  112.         TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);               //使能定時器中斷
  113.                
  114.        
  115.         NVIC_InitStruct.NVIC_IRQChannel = TIM1_UP_IRQn;        //使能外部中斷通道
  116.         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;           //使能外部中斷通道
  117.         NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //搶占優先級1
  118.         NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;        //響應優先級1
  119.         NVIC_Init(&NVIC_InitStruct);
  120.        
  121.         TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;             //選擇PWM1模式
  122.         TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  123.         TIM_OCInitStruct.TIM_Pulse = 0;                            //設置待裝入捕獲比較寄存器的脈沖值
  124.         TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;     //設置輸出極性
  125.         TIM_OC4Init(TIM1,&TIM_OCInitStruct);                       //初始化輸出比較參數
  126.        
  127.         TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能預裝載寄存器
  128.                 TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能預裝載寄存器
  129.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能預裝載寄存器
  130.                 TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);   //CH4使能預裝載寄存器
  131.                
  132.         TIM_CtrlPWMOutputs(TIM1,ENABLE);  //高級定時器輸出需要設置這句
  133.        
  134.         TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIM1在ARR上的預裝載寄存器
  135.         TIM_ClearFlag(TIM1, TIM_FLAG_Update);  // Clears the TIMx's pending flags.
  136. //        TIM1->CCR4=1400;
  137. //       
  138. //        TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許TIM1更新中斷|允許TIM1通道1捕獲中斷       
  139.         TIM_Cmd(TIM1,ENABLE);                              //使能定時器1
  140. }



  141. void Count_Dist(void)
  142.         {
  143.         int distance = 0, sum = 0;
  144.         uint16_t time;
  145.         uint16_t i = 0;
  146.         delay_init();  //在 delay.h 中
  147.                     TRIG_Init();
  148.         while(i < 5){
  149.                 GPIO_SetBits(GPIOB, GPIO_Pin_12);
  150.                 delay_us(20);
  151.                 GPIO_ResetBits(GPIOB, GPIO_Pin_12);
  152.                                        TIM_Cmd(TIM1,DISABLE);  //關閉定時器
  153.                TIM1->CCR1=0;  //TIM3的計數器清零
  154.                 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);
  155.                  TIM_Cmd(TIM1, ENABLE);  //打開定時器
  156.                 i += 1;
  157.                 while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 1);  //回響信號消失
  158.                 TIM_Cmd(TIM1,DISABLE);  //關閉定時器


  159.                 time = TIM_GetCounter(TIM1);  //獲取 TIM2 計數值;  //獲取 TIM2 計數值

  160.                 distance = (time + count*1000)/58.0;  //通過回響信號計算距離
  161.                 sum = distance + sum;  //將五次結果相加

  162.                 TIM1->CCR1 = 0;  //將TIM2計數寄存器的計數值清零
  163.                 count = 0;  //中斷溢出次數清零
  164.                 delay_ms(10);
  165.         }      
  166.         distance = (sum/5);  //取5次的平均值
  167.                                         printf("%d  \n",distance);       
  168.       
  169. }

  170. void TIM1_UP_IRQHandler(void) {  //中斷函數
  171.         if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) {
  172.                 TIM_ClearITPendingBit(TIM1, TIM_IT_Update);  //清除中斷標志

  173.                 count++;
  174.         }
  175. }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-1-18 17:48 | 只看該作者
舵機需要輸出穩定而連續的脈沖來維持角度
所以舵機的定時器不能停
但編碼器測速不用連續去量
可以借一下定時器來用
回復

使用道具 舉報

板凳
ID:462324 發表于 2022-1-18 18:34 | 只看該作者
lkc8210 發表于 2022-1-18 17:48
舵機需要輸出穩定而連續的脈沖來維持角度
所以舵機的定時器不能停
但編碼器測速不用連續去量

好的,那我就測一個輪子的速度就可以,謝謝呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一区在线观看 | 国产成人免费网站 | 亚洲精品电影在线观看 | 91精品久久久久久久久99蜜臂 | av中文字幕在线观看 | 青青草在线视频免费观看 | 日韩一区二区黄色片 | 亚洲va中文字幕 | a级黄色片在线观看 | 91精品午夜窝窝看片 | 亚洲福利网站 | 911网站大全在线观看 | 精品久久久久一区二区国产 | 亚洲精品视频一区二区三区 | 国产成人精品999在线观看 | 亚洲一视频 | 欧美日韩第一页 | 91豆花视频| 午夜看电影在线观看 | 国产精品久久久久久久久久久免费看 | 黄色在线观看 | 国产一在线观看 | 久久91精品国产一区二区 | 91福利网 | 欧美日韩高清在线一区 | 日韩国产一区二区三区 | 欧美一区二区在线播放 | 婷婷激情在线 | 亚洲久草视频 | 国产精品久久久久久影视 | 一区视频 | 成人av电影在线观看 | 国产美女视频一区 | 亚洲欧美视频在线观看 | 久久精品 | 中文字幕在线欧美 | 午夜免费观看 | 久久99精品国产自在现线小黄鸭 | 国产美女特级嫩嫩嫩bbb片 | 国产1区| 波多野结衣av中文字幕 |