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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32手機藍牙控制實例分享

[復制鏈接]
跳轉到指定樓層
樓主
ID:245534 發表于 2017-11-3 00:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
分享一份很好的資料,關于怎么樣使用手機來控制開發板的,里面有一些實例,都是漢德樂電子網絡工作室,開人員自行編寫的,通過這份資料相信你也能很好的將你的手機和開發板連接起來,下面不多講,直接上資料!
1、首先介紹一下什么是透明傳輸:
透明傳輸是指不管所傳數據是什么樣的比特組合,都應當能夠在鏈路上傳送。當所傳數據中的比特組合恰巧與某一個控制信息完全一樣時,就必須采取適當的措施,使接收方不會將這樣的數據誤認為是某種控制信息。這樣才能保證數據鏈路層的傳輸是透明的。發送方和接收方數據的長度和內容完全一致,相當于一條無形的傳輸線。
2、透傳模塊:
Handler_Bluetooth_PWM 平臺上使用的是FBT_06(嵌入式近距離主從分離/一體式藍牙串口通訊模塊)
特點:
藍牙2.0 帶EDR, 2Mbps-3Mbps 調制度
內置2.4GHz 天線, 用戶無需調試天線
外置8Mbit FLASH
低電壓3.3V 工作(3.1V~4.2V)配對時30~40MA 波動,配對完畢通信8MA
可選PIO 控制
標準HCI 端口(UART or USB)
USB 協議: Full Speed USB1.1, Compliant With 2.0
發射功率屬于class2(約15米)
3、Handler_Bluetooth_PWM 平臺(引用)
該平臺由Handler_Studio 設計,初始目的是專門為四軸飛行器等陸地、空中機器人提供處理核心,而后被大家將其擴展到了各個領域,進行了五花八門的設計應用。
該平臺基于stm32 進行研發設計,接口人性化,相比市面上的常見的multiwill 平臺的mega328、mega2560 等飛控具有主頻高、處理速度快、性能穩定等顯著優點。
該平臺有多達10 通道的硬件PWM 輸出,足以應付10 軸飛行器、機器人、機器手臂、蛇形機器人等涉及舵機、直流電機、步進電機、無刷電機等的控制工作。

亮點1:平臺具有配套的安卓控制軟件,并開源平臺源碼,方便二次開發!
亮點2:平臺引出了常用的通信接口:如串口、SPI、IIC 等,這樣極大地擴展了平臺的適應性,方便我們的DIY!!
亮點3:平臺不僅可以和手機、電腦進行通信,兩平臺之間也可通信:典型應用:無線串口!無線串口功能可應用在例如飛思卡爾智能車的調試當中。
4、藍牙透傳實例
本文檔給大家講述如何用借助Handler_Bluetooth_PWM 平臺通過手機控制產生多路PWM 以控制舵機!
說明:
硬件平臺:Handler_Bluetooth_PWM 飛控板
開發環境:keilMDK
Stm 庫版本:V3.0.0
首先需要配置stm32 的串口:
1、使能時鐘
2、使能串口中斷
3、初始化串口
這里想重點說明一下串口數據的接收策略:
不怕麻煩舉四個例子說明,如果很了解就跳過,初學者還是有作用的(歡迎拍磚)
實例一:
void USART1_IRQHandler(u8 GetData)
{
u8 BackData;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中斷產生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標志.
GetData = UART1_GetByte(BackData); //也行GetData=USART1->DR;
USART1_SendByte(GetData); //發送數據
GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED閃爍,接收成功發送完成
delay(1000);
GPIO_ResetBits(GPIOE, GPIO_Pin_8 );
}
}
這是最基本的,將數據接收完成后又發送出去,接收和發送在中斷函數里執行,main 函數里無其他要處理的。
優點:簡單,適合很少量數據傳輸。
缺點:無緩存區,并且對數據的正確性沒有判斷,數據量稍大可能導致數據丟失。
實例二:
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標志
Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);
Uart2_Rx_Num++;
}
if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5)) //判斷最
后接收的數據是否為設定值,確定數據正確性
Uart2_Sta=1;
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
USART_ReceiveData(USART2); //讀DR
}
}
if( Uart2_Sta )
{
for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)
USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //發送數據
Uart2_Rx_Num = 0; //初始化
Uart2_Tx_Num = 0;
Uart2_Sta = 0;
}
這是加了數據頭和數據尾的接收方式,數據頭和尾的個數可增加,此處只用于調試之用。中斷函數用于接收數據以及判斷數據的頭尾,第二個函數在main 函數里按照查詢方式執行。
優點:較簡單,采用緩存區接收,對提高數據的正確行有一定的改善。
缺點:要是第一次數據接收錯誤,回不到初始化狀態,必須復位操作。
實例三:
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標志.
Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);
Uart2_Rx++;
Uart2_Rx &= 0x3F; //判斷是否計數到最大
}
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
USART_ReceiveData(USART2); //讀DR
}
}
if( Uart2_Tx != Uart2_Rx )
{
USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //發送數據
Uart2_Tx++;
Uart2_Tx &= 0x3F; //判斷是否計數到最大
}
采用FIFO 方式接收數據,由0x3F 可知此處最大接收量為64 個,可變,中斷函數只負責收,
另一函數在main 函數里執行,FIFO 方式發送。
優點:發送和接收都很自由,中斷占用時間少,有利于MCU 處理其它。
缺點:對數據的正確性沒有判斷,一概全部接收。
實例四:
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標志
Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);
Uart2_Rx++;
Uart2_Rx &= 0xFF;
}
if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //頭
Uart2_Tx = Uart2_Rx-1;
if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //
檢測到頭的情況下檢測到尾
{
Uart2_Len = Uart2_Rx-1- Uart2_Tx; //長度
Uart2_Sta=1; //標志位
}
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
USART_ReceiveData(USART2); //讀DR
}
}
if( Uart2_Sta )
{
for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)
USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //發送數據
Uart2_Rx = 0; //初始化
Uart2_Tx = 0;
Uart2_Sta = 0;
}
數據采用數據包的形式接收,接收后存放于緩存區,通過判斷數據頭和數據尾(可變)來判
斷數據的“包”及有效性,中斷函數用于接收數據和判斷頭尾以及數據包長度,另一函數在
main 函數里執行,負責發送該段數據。
優點:適合打包傳輸,穩定性和可靠性很有保證,可隨意發送,自動挑選有效數據。
缺點:緩存區數據長度要根據“包裹”長度設定, 要是多次接收后無頭無尾,到有頭有尾
的那一段數據恰好跨越緩存區最前和最后位置時,可能導致本次數據丟失,不過這種情況幾
乎沒有可能。
不論使用哪種方法,都是可以實現簡單的功能的,一般來說中斷里面只負責接收數據,而
不要在其進行數據的處理。

接下來需要設置stm32 的TIM 模塊
由于平臺上的處理器是STM32CBT6,定時器有4 個,分別是一個高級控制定時器TIM1,和三個通用定時器。
TIMER 輸出PWM 實現步驟:
1. 設置RCC 時鐘;
2. 設置GPIO 時鐘;
3. 設置TIMx 定時器的相關寄存器;
4. 設置TIMx 定時器的PWM 相關寄存器。
附上源碼(以TIM2 為例:兩個通道)
/*
* 函數名:TIM2_GPIO_Config
* 描述:配置TIM3復用輸出PWM時用到的I/O
* 輸入:無
* 輸出:無
* 調用:內部調用
*/
static void TIM2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* TIM3 clock enable */
//PCLK1經過2倍頻后作為TIM3的時鐘源等于36MHz
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* GPIOA and GPIOB clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
/*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
static void TIM2_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* PWM信號電平跳變值*/
u16 CCR1_Val = 251;
u16 CCR2_Val = 251;
/* -----------------------------------------------------------------------
TIM2 Configuration: generate 4 PWM signals with 4 different duty cycles:
TIM2CLK = 36 MHz, Prescaler = 0x0, TIM3 counter clock = 36 MHz
TIM2 ARR Register = 999 => TIM2 Frequency = TIM2 counter clock/(ARR + 1)
TIM2 Frequency = 36 KHz.
----------------------------------------------------------------------- */
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 9999; //當定時器從0計數到999,即為1000
次,為一個定時周期
TIM_TimeBaseStructure.TIM_Prescaler = 144; //設置預分頻:不預分頻,即為
36MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設置時鐘分頻系數:不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置為PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1_Val; //設置跳變值,當計數器計數到這個
值時,電平發生跳變
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //當定時器計數值小
于CCR1_Val時為高電平
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR2_Val; //設置通道2的電平跳變值,輸出另外
一個占空比的PWM
TIM_OC2Init(TIM2, &TIM_OCInitStructure); //使能通道2
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE); // 使能TIM2重載寄存器ARR
/* TIM2 enable counter */
TIM_Cmd(TIM2, ENABLE); //使能定時器2
}
/*
* 函數名:TIM2_Mode_Config
* 描述:TIM2 輸出PWM信號初始化,只要調用這個函數
* TIM2的兩個通道就會有PWM信號輸出
* 輸入:無
* 輸出:無
* 調用:外部調用
*/
void TIM2_PWM_Init(void)
{
TIM2_GPIO_Config();
TIM2_Mode_Config();
}
在配置其他兩個通用定時器時,配置幾乎是相同的,但是在配置TIM1 的時候需要加這個函數以使能TIM1 的PWM 輸出
TIM_CtrlPWMOutputs(TIM1, ENABLE);

這樣這個工程的基本功能就都具備了,接下來只需要處理手機端發過來的數據進行調節PWM 輸出即可。數據可以自定協議。這里簡單的說明一下,由于平臺上有10 個通道所以我規定手機端發送過來的數據在十個數據之間要有所區別,我設定發送格式為Aa1000B其中A 和B 是數據包的首和尾,a 代表第一通道,相應的有b 通道、c 通道...1000 代表占空比。
這樣一個基于Handler_Bluetooth_PWM 平臺的通過手機產生多路PWM 控制舵機的程序就完成了。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:319334 發表于 2018-6-13 14:46 | 只看該作者
資料不錯,值得學習
回復

使用道具 舉報

板凳
ID:351587 發表于 2018-6-14 10:49 | 只看該作者
有參考價值,謝謝
回復

使用道具 舉報

地板
ID:243748 發表于 2018-6-25 06:42 來自手機 | 只看該作者
很詳細的注譯,謝謝樓主
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲自拍偷拍视频 | 午夜小电影 | 久久首页 | 狠狠入ady亚洲精品经典电影 | 色噜噜亚洲男人的天堂 | 中文字幕在线看第二 | 欧美日韩1区 | 欧美一级二级视频 | aaaa网站 | 日韩精品一区二区三区在线观看 | 免费看淫片| 密桃av | 久久久久久久一区二区三区 | 中文在线a在线 | 美女视频三区 | 国产午夜精品一区二区三区在线观看 | 成人h动漫精品一区二区器材 | 激情六月丁香婷婷 | 91亚洲国产精品 | 久久精品91久久久久久再现 | 欧美一区二区三区视频 | 91www在线观看| 亚洲一区不卡 | 成人区一区二区三区 | 国产乱码精品一区二区三区五月婷 | 老司机深夜福利网站 | 日韩精品无码一区二区三区 | 91视频在线 | 日韩在线视频免费观看 | 国产欧美视频一区二区 | 欧美久久不卡 | 国产亚洲一区精品 | 国产精品麻 | 免费av一区二区三区 | 伊人春色在线观看 | 亚洲成网 | 中文字幕一区在线观看视频 | 国产一区二区在线免费观看 | 欧美伊人 | 亚洲成av人影片在线观看 | 欧美在线亚洲 |