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

標題: 單片機定時器1,舵機和超聲波沖突了,應該怎么設置呀? [打印本頁]

作者: 哈哈你好1    時間: 2022-1-18 13:18
標題: 單片機定時器1,舵機和超聲波沖突了,應該怎么設置呀?
舵機和超聲波沖突了,應該怎么設置呀,定時器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. }
復制代碼



作者: 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| 色综久久| 亚洲成人免费观看 | 久国产| 日日摸夜夜添夜夜添特色大片 |