基於Qt的wifi智能小車的製做(一)函數
很久不寫博客了,真的是有點慚愧了。翻開上一次的博客,到如今已經2個多月了,只能說是本身太懶惰了!忙是另外一回事!趁今天晚上有點時間回顧下這一段時間的收穫以及作的一些東西,算是一份筆記,一遍之後能回想起。性能
首先說說開始作的一款wifi小車吧,一方面是由於我的的愛好,一方面算是其餘緣由。首先上幾張小車照片。spa
因爲光線緣由,可能不太清楚。一下是個人上位機,基於Qt的,整體感受仍是挺漂亮的,不過最主要的仍是有美工的幫助了,在這裏多謝這位美工了。(小車控制主界面).net
再來一張配置控制協議。其中有視頻流地址、控制地址以及端口號,控制動做命令等等……orm
其實作這個小車根本沒有多少難度的,之因此要作也是本身的愛好罷了,今天在這裏記錄下一些珍貴的東西,但願本身之後看到後能想起其中的過程,最讓人享受的仍是作某一件東西的過程。但願高手最下留情。視頻
1.下位機blog
0.5ms-------------0 度
1.0ms-------------45 度
1.5ms-------------90 度
2.0ms-------------135 度
2.5ms-------------180 度
具體的描述以下圖所示:
4)實現程序代碼:硬件鏈接:雲臺上下轉動舵機鏈接 VCC、 GND、 PB6;雲臺左右轉動舵機鏈接 VCC、GND、 PB8
- <span style="font-size:18px;font-weight: normal;">#define ANGLE_000 2 //0 度
- #define ANGLE_045 10 //45 度
- #define ANGLE_090 15 //90 度
- #define ANGLE_135 20 //135 度
- #define ANGLE_180 28 //180 度
- /* 全局變量 */
- static u8 CloudStand_Horizontal_Line = 15; //雲臺水平移動
- static u8 CloudStand_Vertical_Line = 15; //雲臺垂直移動
- </span>
- <span style="font-size:18px;font-weight: normal;">/* TIM4 PWM 部分初始化, PWM 輸出初始化, arr 爲自動重裝值; psc 爲時鐘
- 預分頻數 */</span>
- <span style="font-size:18px;font-weight: normal;">
- static void TIM4_PWM_Init(u16 arr,u16 psc)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;</span>
- <span style="font-size:18px;"><span style="font-weight: normal;">
- </span>下面切記兩個 APB 時鐘初始化,調用不一樣的初始化函數,有同窗不注意,常常
- 在這裏出問題</span><span style="font-size:18px;font-weight: normal;">。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,
- ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
- //設置該引腳爲複用輸出功能,輸出 TIM4 的 PWM 脈衝波形
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_8;
- //TIM_CH1 TIM_CH3
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- //複用推輓輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- //初始化 GPIO
- //初始化 TIM4
- TIM_TimeBaseStructure.TIM_Period = arr;
- //設置在下一個更新事件裝入活動的自動重裝載寄存器週期的值
- TIM_TimeBaseStructure.TIM_Prescaler = psc;
- //設置用來做爲 TIMx 時鐘頻率除數的預分頻值
- TIM_TimeBaseStructure.TIM_ClockDivision = 0;
- //設置時鐘分割
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- //TIM 向上計數模式
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
- //根據 TIM_TimeBaseInitStruct 中指定的參數初始化 TIMx 的時間基數單位
- //初始化 TIM4 通道 1 PWM 模式
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- //選擇定時器模式:TIM 脈衝寬度調製模式 2
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- //正向通道有效
- TIM_OCInitStructure.TIM_Pulse = 300;
- //佔空時間 總的週期爲 20ms 佔空時間爲約爲 1ms
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
- //輸出極性:TIM 輸出比較極性高
- 這 裏 的 TIM_OC1Init 、 TIM_OC1PreloadConfig 、 TIM_OC3Init 、
- TIM_OC3PreloadConfig 的調用,庫函數已經將管腳和 TIM 的通道進行匹配,讀者一
- 定要與本身的配置符合。
- TIM_OC1Init(TIM4, &TIM_OCInitStructure);
- TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
- //使能預裝載寄存器
- //初始化 TIM4 通道 3 PWM 模式
- TIM_OC3Init(TIM4, &TIM_OCInitStructure);
- TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
- //使能預裝載寄存器
- TIM_ARRPreloadConfig(TIM4, ENABLE);
- TIM_Cmd(TIM4, ENABLE);
- //使能 TIM4
- CloudStand_Middle();
- }
- void CloudStand_Up(void)
- {
- if(CloudStand_Vertical_Line > ANGLE_000 +1 )
- {
- CloudStand_Vertical_Line--;
- TIM_SetCompare1(TIM4,CloudStand_Vertical_Line);
- 注意:這裏的 TIM_SetCompare一、 TIM_SetCompare3 函數的調用,要與前面的
- 硬件鏈接管腳、 TIM 通道一致,由於本人此處爲 TIM1 通道和 TIM3 通道,因此這裏調用 TIM_SetCompare一、 TIM_SetCompare3 函數。 <span style="font-weight: normal;">
- //將上下轉動值與寄存器 1 中的值進行比較,左右轉動值和寄存器 3 中的值進
- 行比較
- }
- if(CloudStand_Vertical_Line == ANGLE_000 +1 )
- {
- CloudStand_Vertical_Line++;
- }
- }
- void CloudStand_Down(void)
- {
- if(CloudStand_Vertical_Line < ANGLE_180 -1 )
- {
- CloudStand_Vertical_Line++;
- TIM_SetCompare1(TIM4,CloudStand_Vertical_Line);
- }
- if(CloudStand_Vertical_Line == ANGLE_180 -1 )
- {
- CloudStand_Vertical_Line--;
- }
- }
- void CloudStand_Left(void)
- {
- if(CloudStand_Horizontal_Line > ANGLE_000 +1 )
- {
- CloudStand_Horizontal_Line--;
- TIM_SetCompare3(TIM4,CloudStand_Horizontal_Line);
- }
- if(CloudStand_Horizontal_Line == ANGLE_000 +1 )
- {
- CloudStand_Horizontal_Line++;
- }
- }
- void CloudStand_Right(void)
- {
- if(CloudStand_Horizontal_Line < ANGLE_180 -1 )
- CloudStand_Horizontal_Line++;
- TIM_SetCompare3(TIM4,CloudStand_Horizontal_Line);
- }
- if(CloudStand_Horizontal_Line == ANGLE_180 -1 )
- {
- CloudStand_Horizontal_Line--;
- }
- }
- void CloudStand_Middle(void)
- {
- CloudStand_Horizontal_Line = 15;
- CloudStand_Vertical_Line = 15;
- TIM_SetCompare1(TIM4,ANGLE_000);
- TIM_SetCompare3(TIM4,ANGLE_090);
- }
- void CloudStand_Init(void)
- {
- TIM4_PWM_Init(199,7199); //PWM 頻率 = 50Hz
- }
小車方向控制相關原理接口
小車的方向就是經過控制stm32管腳的電平的高低來驅動LM298N實現所要的功能。詳情看附件中的代碼。在這裏就不作過多的介紹,介紹多了會被人說成……………………。事件
2.上位機
在下一篇中將重點記錄上位機功能的實現。