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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

stm32藍牙控制舵機問題:想知道如何實現藍牙控制舵機慢慢轉動

[復制鏈接]
跳轉到指定樓層
樓主
ID:922391 發表于 2021-7-19 16:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#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;
               
  }
}


舵機

#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 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:393699 發表于 2021-7-19 17:31 | 只看該作者
TIM_SetCompare1  這個應該是控制單片機PWM的函數吧,通過定時調整函數  可以調整PWM的輸出波形,舵機每個角度有對應的PWM頻率和周期。藍牙一般都用的模塊吧,直接AT指令,串口發送和接收字符串就行。
回復

使用道具 舉報

板凳
ID:922391 發表于 2021-7-19 17:34 | 只看該作者
1092648746 發表于 2021-7-19 17:31
TIM_SetCompare1  這個應該是控制單片機PWM的函數吧,通過定時調整函數  可以調整PWM的輸出波形,舵機每個 ...

如果想要讓舵機任意轉動角度,經過藍牙發送指令點一下舵機轉一下該怎么實現呢?
回復

使用道具 舉報

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

使用道具 舉報

5#
ID:922391 發表于 2021-7-20 15:14 | 只看該作者
可不可以用一個循環
TIM3_PWM_Init(199,7199);
TIM_SetCompare1(TIM3,i);  
然后對i進行疊加,實現度數的微小變化

回復

使用道具 舉報

6#
ID:954170 發表于 2021-7-20 15:38 | 只看該作者
控制舵機旋轉方法:
1、控制信號(如圖H)是一種脈寬調制(PWM)信號,凡是微控制器能輕松的產生這種信號。在此文中,我用的是常用的Arduino開發環境下的微控制器。
2、 脈沖的高電平持續1到2毫秒(ms),也就是1000到2000微秒(μs)。在1000μs時,舵機左滿舵。在2000μs時,右滿舵。不過你可以通過調整脈寬來實現更大或者更小范圍內的運動。
3、控制脈沖的低電平持續20毫秒。每經過20毫秒(50次每秒),就要再次跳變為高電平,否則舵機就可能罷工,難以保持穩定。不過你要是想讓它一瘸一拐的跳舞,倒可以采取這種方法。

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

使用道具 舉報

7#
ID:280000 發表于 2021-8-4 15:04 | 只看該作者
單片機輸出不同的PWM即可實現
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: jizz亚洲人 | 午夜精品一区二区三区在线 | 欧美黄色片 | 国产精品不卡 | 狠狠干天天干 | 国产日韩91 | 国产日韩精品一区二区 | 亚洲性在线 | 一二区视频 | 少妇一级淫片aaaaaaaaa | 国产亚洲欧美在线视频 | 亚洲人精品午夜 | 一级全黄少妇性色生活免费看 | 日韩欧美1区2区 | 日日摸日日添日日躁av | 国产精品免费一区二区三区 | 亚洲成人99 | 欧美黑人一区二区三区 | 香蕉视频一区二区 | 国产精品一区二区无线 | 99精品欧美一区二区三区综合在线 | 国产精品久久二区 | 91大神在线资源观看无广告 | 视频一区二区在线观看 | 国产激情网 | 色综合视频| 亚洲精品视 | 涩涩视频在线观看免费 | www.亚洲一区二区三区 | 国产精品免费小视频 | 久久草在线视频 | 日韩在线不卡 | 日韩视频精品在线 | www一级片 | 精品国产青草久久久久福利 | 日韩伦理一区二区 | 免费v片 | 欧美日韩网站 | 丁香五月缴情综合网 | 成人小视频在线观看 | 亚洲电影第三页 |