找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3001|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

stm32藍(lán)牙控制舵機(jī)問題:想知道如何實(shí)現(xiàn)藍(lán)牙控制舵機(jī)慢慢轉(zhuǎn)動(dòng)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:922391 發(fā)表于 2021-7-19 16:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "stm32f10x.h"
#include "usart.h"
#include "timer.h"
#include "duoji.h"
#include "delay.h"
#include "math.h"
#include "sys.h"

void delay(u8 count)
{
        for(; count!=0 ; count--);
}

int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
        usart_Init()
   TIM3_PWM_Init(199,7199)
//        TIM2_PWM_Init(199,719

        while(1)
        {
      
        }
}
void USART1_IRQHandler(void
{
        u8 res;
        res=USART_ReceiveData(USART1)
        switch(res)/

        {
                case'6':duoji1();
           TIM_SetCompare3(TIM3,180);
                break;      
      case'7':duoji2();
                TIM_SetCompare3(TIM3,175);         
                break;
               
  }
}


舵機(jī)

#include "duoji.h"
#include "stm32f10x.h"
#include "delay.h"

void TIM3_PWM_Init(u16 arr, u16 psc)  
{
        GPIO_InitTypeDef GPIO_InitTypeSture;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
        TIM_OCInitTypeDef TIM_OCInitTypeStrue;
      
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
        
        GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitTypeSture.GPIO_Pin =  GPIO_Pin_0;
        GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitTypeSture);
      
        
        TIM_TimeBaseInitTypeSture.TIM_Period = arr;
        TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
        TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitTypeSture);
      
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
      
        TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitTypeStrue.TIM_Pulse = 0;
        TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
      
        TIM_OC1Init(TIM3, &TIM_OCInitTypeStrue);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
      
        TIM_Cmd(TIM3, ENABLE);
}

void TIM2_PWM_Init(u16 arr, u16 psc)  
{
        GPIO_InitTypeDef GPIO_InitTypeSture;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeSture;
        TIM_OCInitTypeDef TIM_OCInitTypeStrue;
      
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
      
        
        GPIO_InitTypeSture.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitTypeSture.GPIO_Pin =  GPIO_Pin_3;
        GPIO_InitTypeSture.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitTypeSture);
      
        
        TIM_TimeBaseInitTypeSture.TIM_Period = arr;
        TIM_TimeBaseInitTypeSture.TIM_Prescaler = psc;
        TIM_TimeBaseInitTypeSture.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitTypeSture.TIM_ClockDivision = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeSture);
      
        GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);
      
        TIM_OCInitTypeStrue.TIM_OCMode = TIM_OCMode_PWM2;
        TIM_OCInitTypeStrue.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitTypeStrue.TIM_Pulse = 0;
        TIM_OCInitTypeStrue.TIM_OutputState = TIM_OutputState_Enable;
      
        TIM_OC1Init(TIM2, &TIM_OCInitTypeStrue);
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
      
        TIM_Cmd(TIM2, ENABLE);
}

void duoji1(void)
{
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
        delay_ms(1000);
        TIM_SetCompare3(TIM3,180);         
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000

}

//void duoji12(void
/
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,180);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000

/


void duoji2(void)
{
//        TIM_SetCompare1(TIM2,195);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM2,180);      
//        delay_ms(1000
        TIM_SetCompare3(TIM3,175);         
        delay_ms(1000);

}

//void duoji22
/
//        TIM_SetCompare1(TIM3,175);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,180);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,185);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,190);      
//        delay_ms(1000
//        TIM_SetCompare1(TIM3,195);      
//        delay_ms(1000

/

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

使用道具 舉報(bào)

沙發(fā)
ID:393699 發(fā)表于 2021-7-19 17:31 | 只看該作者
TIM_SetCompare1  這個(gè)應(yīng)該是控制單片機(jī)PWM的函數(shù)吧,通過定時(shí)調(diào)整函數(shù)  可以調(diào)整PWM的輸出波形,舵機(jī)每個(gè)角度有對(duì)應(yīng)的PWM頻率和周期。藍(lán)牙一般都用的模塊吧,直接AT指令,串口發(fā)送和接收字符串就行。
回復(fù)

使用道具 舉報(bào)

板凳
ID:922391 發(fā)表于 2021-7-19 17:34 | 只看該作者
1092648746 發(fā)表于 2021-7-19 17:31
TIM_SetCompare1  這個(gè)應(yīng)該是控制單片機(jī)PWM的函數(shù)吧,通過定時(shí)調(diào)整函數(shù)  可以調(diào)整PWM的輸出波形,舵機(jī)每個(gè) ...

如果想要讓舵機(jī)任意轉(zhuǎn)動(dòng)角度,經(jīng)過藍(lán)牙發(fā)送指令點(diǎn)一下舵機(jī)轉(zhuǎn)一下該怎么實(shí)現(xiàn)呢?
回復(fù)

使用道具 舉報(bào)

地板
ID:871393 發(fā)表于 2021-7-20 10:10 | 只看該作者
新建一個(gè)變量, 用你的藍(lán)牙操作去修改那個(gè)變量, 再由變量去修改舵機(jī)的角度.
類似這種
u8 degree = 90;
set_pwm(degree);
回復(fù)

使用道具 舉報(bào)

5#
ID:922391 發(fā)表于 2021-7-20 15:14 | 只看該作者
可不可以用一個(gè)循環(huán)
TIM3_PWM_Init(199,7199);
TIM_SetCompare1(TIM3,i);  
然后對(duì)i進(jìn)行疊加,實(shí)現(xiàn)度數(shù)的微小變化

回復(fù)

使用道具 舉報(bào)

6#
ID:954170 發(fā)表于 2021-7-20 15:38 | 只看該作者
控制舵機(jī)旋轉(zhuǎn)方法:
1、控制信號(hào)(如圖H)是一種脈寬調(diào)制(PWM)信號(hào),凡是微控制器能輕松的產(chǎn)生這種信號(hào)。在此文中,我用的是常用的Arduino開發(fā)環(huán)境下的微控制器。
2、 脈沖的高電平持續(xù)1到2毫秒(ms),也就是1000到2000微秒(μs)。在1000μs時(shí),舵機(jī)左滿舵。在2000μs時(shí),右滿舵。不過你可以通過調(diào)整脈寬來實(shí)現(xiàn)更大或者更小范圍內(nèi)的運(yùn)動(dòng)。
3、控制脈沖的低電平持續(xù)20毫秒。每經(jīng)過20毫秒(50次每秒),就要再次跳變?yōu)楦唠娖,否則舵機(jī)就可能罷工,難以保持穩(wěn)定。不過你要是想讓它一瘸一拐的跳舞,倒可以采取這種方法。

1、什么是舵機(jī):在機(jī)器人機(jī)電控制系統(tǒng)中,舵機(jī)控制效果是性能的重要影響因素。舵機(jī)可以在微機(jī)電系統(tǒng)和航模中作為基本的輸出執(zhí)行機(jī)構(gòu),其簡(jiǎn)單的控制和輸出使得單片機(jī)系統(tǒng)非常容易與之接口。舵機(jī)是一種位置(角度)伺服的驅(qū)動(dòng)器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。目前在高檔遙控玩具,如航模,包括飛機(jī)模型,潛艇模型;遙控機(jī)器人中已經(jīng)使用得比較普遍。舵機(jī)是一種俗稱,其實(shí)是一種伺服馬達(dá)。
2、工作原理:控制信號(hào)由接收機(jī)的通道進(jìn)入信號(hào)調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個(gè)基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號(hào),將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動(dòng)。當(dāng)然我們可以不用去了解它的具體工作原理,知道它的控制原理就夠了。就象我們使用晶體管一樣,知道可以拿它來做開關(guān)管或放大管就行了,至于管內(nèi)的電子具體怎么流動(dòng)是可以完全不用去考慮的。
回復(fù)

使用道具 舉報(bào)

7#
ID:280000 發(fā)表于 2021-8-4 15:04 | 只看該作者
單片機(jī)輸出不同的PWM即可實(shí)現(xiàn)
回復(fù)

使用道具 舉報(bào)

8#
ID:914689 發(fā)表于 2021-8-4 19:45 | 只看該作者
加個(gè)PID可以很平緩控制
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表