<center id="qkqgy"><optgroup id="qkqgy"></optgroup></center>
  • <menu id="qkqgy"></menu>
    <nav id="qkqgy"></nav>
    <xmp id="qkqgy"><nav id="qkqgy"></nav>
  • <xmp id="qkqgy"><menu id="qkqgy"></menu>
    <menu id="qkqgy"><menu id="qkqgy"></menu></menu>
    <tt id="qkqgy"><tt id="qkqgy"></tt></tt>

  • 前言:之前做arduino小車的時候使用的是L298N電機,沒有用過編碼器,這次第一次用編碼器,還是比較懵圈,記錄一下學的整個過程。

    1.編碼器的簡介

    霍爾編碼器是一種通過磁電轉換將輸出軸上的機械幾何位移量轉換成脈沖或數字量的傳感器。

    霍爾編碼器是由霍爾碼盤(磁環)和霍爾元件組成。

    霍爾碼盤是在一定直徑的圓板上等分地布置有不同的磁極。霍爾碼盤與電動機同軸,電動機旋轉時,霍爾元件檢測輸出若干脈沖信號,為判斷轉向,一般輸出兩組存在一定相位差的方波信號

    編碼器為了獲得每一圈的脈沖數,通過公式可以將其轉化為當前電機的轉速,從而達到測速的目的。

    2.接線方式:

    我買的是tb6612的一個綜合體驅動模塊,這樣接線比較方便。

    ?v---5v電源? ? ? ? G----GND【接地】? ? A和B則是編碼器的A,B相。

    M1和M2則和電機的E1A和E1B相連接? ?

    3.編碼器的倍頻原理

    ?正常的情況都是去捕獲一個相位的上升沿或者下降沿,這樣每個周期只能捕獲一次

    編碼器的四倍頻技術就是,
    單個周期內,同時捕獲A和B的上升沿和下降沿,這樣單個周期內就可以捕獲四次,翻了四倍,當A因為跳變觸發了外部中斷,在中斷里面判斷B是什么電平,從而來判斷當前輪子是正轉還是反轉。

    4.編碼器的計數原理

    編碼器選擇的是四倍頻技術,即在T1和T2同時進行計數。

    借助這個計數,可以算出固定周期內的編碼器的脈沖數,借助M測速法,算出當前的電機的速度。

    同時根據圖可以發現,A相在前就是輪子正轉,B相在前就是輪子反轉。

    5.編碼器代碼理解

    ?設置為65536,為了增大計數周期,且計數頻率加快,保證了系統的不管輪子轉速多塊都可以檢測到當前的脈沖次數

    ?TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,
    TIM_ICPolarity_Rising);

    第一個:定時器的選擇

    第二個:選擇是T1和T2,進行雙通道的上下沿計數。

    第三,四個:反相or不反相

    不反相:正轉,計數++,反轉,計數--。

    反相:正轉,計數--,反轉,計數++。?

    ?這里將其中的一個脈沖值的讀入前面加入負號,因為兩個輪子安裝是相反的,這樣是為了保持極性的一致。

    此時計數器的數值便是在TIM4定時器單個周期內,計算左右輪子的脈沖數。

    某乎的這張圖很清晰的介紹了霍爾編碼器的運行方式。

    ?6.PWM輸出使能

    設置定時器的通道PWM輸出使能,然后設置IO口控制電平的輸出。

    設置輸出通道的極性,和PWM輸出模式。
    void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef
    TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外設時鐘使能
    //設置該引腳為復用輸出功能,輸出TIM1 CH1 CH4的PWM脈沖波形 GPIO_InitStructure.GPIO_Pin =
    GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 //TIM_CH4 GPIO_InitStructure.GPIO_Mode =
    GPIO_Mode_AF_PP; //復用推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr;
    //設置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc;
    //設置用來作為TIMx時鐘頻率除數的預分頻值 不分頻 TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    //設置時鐘分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode =
    TIM_CounterMode_Up; //TIM向上計數模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數單位 TIM_OCInitStructure.TIM_OCMode =
    TIM_OCMode_PWM1; //選擇定時器模式:TIM脈沖寬度調制模式1 TIM_OCInitStructure.TIM_OutputState =
    TIM_OutputState_Enable; //比較輸出使能 TIM_OCInitStructure.TIM_Pulse = 0;
    //設置待裝入捕獲比較寄存器的脈沖值 TIM_OCInitStructure.TIM_Pulse = arr >> 1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
    TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據TIM_OCInitStruct中指定的參數初始化外設TIMx
    TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根據TIM_OCInitStruct中指定的參數初始化外設TIMx
    TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主輸出使能 TIM_OC1PreloadConfig(TIM1,
    TIM_OCPreload_Enable); //CH1預裝載使能 TIM_OC4PreloadConfig(TIM1,
    TIM_OCPreload_Enable); //CH4預裝載使能 TIM_ARRPreloadConfig(TIM1, ENABLE);
    //使能TIMx在ARR上的預裝載寄存器 TIM_Cmd(TIM1, ENABLE); //使能TIM1 }
    設置IO口進行電平的輸出。
    void Motor_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口時鐘
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    //端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHZ GPIO_Init(GPIOB,
    &GPIO_InitStructure); //根據設定參數初始化GPIOB AIN1=0,AIN2=0; BIN1=0,BIN1=0; }
    通過設置AIN進行輪子的正轉和反轉。

    技術
    下載桌面版
    GitHub
    百度網盤(提取碼:draw)
    Gitee
    云服務器優惠
    阿里云優惠券
    騰訊云優惠券
    華為云優惠券
    站點信息
    問題反饋
    郵箱:ixiaoyang8@qq.com
    QQ群:766591547
    關注微信
    巨胸美乳无码人妻视频