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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32控制舵機源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:486279 發表于 2021-6-7 08:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在做超聲波模塊控制舵機轉向。利用這個的在我們生活中也比較常見,最常見的莫過于避障小車了 現在看一下源碼。
#include "HCSR04.h"
#include "sys.h"
#include "delay.h"

/*
* 函數名:UltrasonicWave_Configuration
* 描述  :超聲波模塊的初始化
* 輸入  :無
* 輸出  :無        
*/
void UltrasonicWave_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
        
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  
        
        
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                         //PC8接TRIG
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     //設為推挽輸出模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 
  GPIO_Init(GPIOB, &GPIO_InitStructure);                         //初始化外設GPIO

        
        

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                     //PC9接ECH0
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                 //設為輸入
  GPIO_Init(GPIOB,&GPIO_InitStructure);               
        
}

/*
* 函數名:UltrasonicWave_StartMeasure
* 描述  :開始測距,發送一個>10us的脈沖,然后測量返回的高電平時間
* 輸入  :無
* 輸出  :無        
*/
void UltrasonicWave_StartMeasure(void)
{
        Trig = 1;
        delay_us(15);                                      //延時20US
        Trig = 0;
}





#include "pwm.h"
#include "delay.h"
#include "sys.h"




//舵機模塊的PWM初始化
void PWM_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;   //聲明一個結構體變量,用來初始化GPIO

        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//聲明一個結構體變量,用來初始化定時器

        TIM_OCInitTypeDef TIM_OCInitStructure;//根據TIM_OCInitStruct中指定的參數初始化外設TIMx

        /* 開啟時鐘 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

        /*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PA1
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        //TIM3定時器初始化
        TIM_TimeBaseInitStructure.TIM_Period = 1999; //PWM 頻率=72000/(1999+1)=36Khz//設置自動重裝載寄存器周期的值
        TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//設置用來作為TIMx時鐘頻率預分頻值
        TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//設置時鐘分割:TDTS = Tck_tim
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上計數模式
        TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);

//        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);//改變指定管腳的映射        //pC6

        //PWM初始化          //根據TIM_OCInitStruct中指定的參數初始化外設TIMx
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM輸出使能
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

        TIM_OC1Init(TIM2,&TIM_OCInitStructure);
        //注意此處初始化時TIM_OC1Init而不是TIM_OCInit,否則會出錯。因為固件庫的版本不一樣。
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的預裝載寄存器
        TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外設
}




void pwm(void)
{
                delay_ms(500);
                TIM_SetCompare1(TIM2, 50);//0度
                delay_ms(1000);
                TIM_SetCompare1(TIM2, 100);//45度
          delay_ms(1000);
                TIM_SetCompare1(TIM2,150);//90度
                delay_ms(1000);
                TIM_SetCompare1(TIM2, 200);//135度
                delay_ms(1000);
                TIM_SetCompare1(TIM2, 250);//180度
                delay_ms(100);
        
}

  1. #include "delay.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "timer.h"
  5. #include "HCSR04.h"
  6. #include "led.h"
  7. #include "pwm.h"


  8. unsigned long S=0; //定義超聲數據

  9. extern unsigned long Clock_time;   


  10. extern u8  TIM3CH1_CAPTURE_STA;                //輸入捕獲狀態                                                   
  11. extern u16        TIM3CH1_CAPTURE_VAL;        //輸入捕獲值       


  12.        

  13. void ceju()
  14. {

  15.         Trig=1;                   
  16.         delay_us(20);                                    
  17.         Trig=0;              //啟動信號

  18.         S=0;                     //清零距離數據
  19.         Clock_time=0;
  20.         TIM_Cmd(TIM3, DISABLE);  //關定時器,清零計時變量       

  21.         while(!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)); //等待檢測到高電平

  22.         Clock_time=0;
  23.         TIM_Cmd(TIM3, ENABLE);  //開定時器

  24.         while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1&&Clock_time<47058);  //只要是高,一直算時間,如果時間計數超過 47058,所說有問題,直接跳過,47058不一定精確,是一個大概值,

  25.         S=((Clock_time*2)*340/10000)/2;   //時間變量是2us加一,乘以速度,因為時間是us,換成秒是除以1000000,保留兩位小數,所以除以 10000,然后除以二得到單方面距離
  26.         TIM_Cmd(TIM3, DISABLE);  //關定時器       
  27.         Clock_time=0;            //清零數據
  28.         GPIO_ResetBits(GPIOD,GPIO_Pin_2);//led 燈
  29.        
  30.         GPIO_ResetBits(GPIOA,GPIO_Pin_8);//led 燈


  31. }



  32. int main(void)
  33. {               


  34.         delay_init();                     //延時函數初始化       
  35.          PWM_Init();
  36.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  37.         LED_Init();                             //LED端口初始化
  38.         UltrasonicWave_Configuration();  //初始化超聲IO
  39.         TIM3_Cap_Init(1,72-1);        //以1Mhz的頻率計數,第一個選項,最小只能是1


  40.         ceju();

  41.   while(1)
  42. {
  43.         ceju();
  44.         if(S<20)
  45.         {
  46.                  GPIO_ResetBits(GPIOA,GPIO_Pin_8);
  47.         GPIO_SetBits(GPIOD,GPIO_Pin_2);
  48. //                pwm();
  49.                 delay_ms(500);
  50.                 pwm();



  51.                 ceju();

  52.         }
  53.         else
  54.                 {
  55.                         GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  56.       GPIO_SetBits(GPIOA,GPIO_Pin_8);
  57.                                 //pwm();
  58.                                 delay_ms(500);

  59.                         ceju();
  60.                 }       
  61. }
  62. }
復制代碼

代碼下載: 超聲波控制舵機.7z (189.64 KB, 下載次數: 25)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线一区 | 成人福利视频 | 亚洲看片网站 | 久久一日本道色综合久久 | 国产激情一区二区三区 | 在线日韩欧美 | 爱操av| 国产成人精品午夜 | 91在线免费视频 | 九九久久精品 | 日本网站免费观看 | 桃花av在线 | 天天操,夜夜爽 | 在线a视频| 精品欧美一区二区三区久久久小说 | a在线视频 | 欧美激情久久久 | 男女羞羞免费视频 | 国产伦精品一区二区三毛 | 亚洲不卡在线观看 | 日本又色又爽又黄又高潮 | 亚洲另类自拍 | www.com久久久 | 色香婷婷 | 欧洲精品在线观看 | 羞羞视频免费在线 | 亚洲另类视频 | 日韩黄 | 一二三四在线视频观看社区 | 亚洲一区二区免费视频 | 91精品国产综合久久久动漫日韩 | 日本成人中文字幕在线观看 | 国产综合久久 | 91在线一区 | 久久亚洲视频 | 羞羞视频网页 | 亚洲精品福利在线 | 亚洲成人精品视频 | 亚洲一区二区在线电影 | 日本午夜在线视频 | 国产成人网 |