|
之前在學(xué)習(xí)stm32的時(shí)候接觸到一個(gè)簡(jiǎn)單的項(xiàng)目--智能垃圾桶。通過(guò)研究它的原理發(fā)現(xiàn)其實(shí)是超聲波模塊HCSR04發(fā)射超聲波接觸到物體會(huì)返回并啟動(dòng)舵機(jī)的旋轉(zhuǎn)。
單片機(jī)源程序如下:
- void PWM_Init()
- {
- GPIO_InitTypeDef GPIO_InitStructure; //聲明一個(gè)結(jié)構(gòu)體變量,用來(lái)初始化GPIO
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//聲明一個(gè)結(jié)構(gòu)體變量,用來(lái)初始化定時(shí)器
- TIM_OCInitTypeDef TIM_OCInitStructure;//根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化外設(shè)TIMx
- /* 開(kāi)啟時(shí)鐘 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- /* 配置GPIO的模式和IO口 */
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// PA1
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復(fù)用推挽輸出
- GPIO_Init(GPIOA,&GPIO_InitStructure);
-
- //TIM3定時(shí)器初始化
- TIM_TimeBaseInitStructure.TIM_Period = 1999; //PWM 頻率=72000/(1999+1)=36Khz//設(shè)置自動(dòng)重裝載寄存器周期的值
- TIM_TimeBaseInitStructure.TIM_Prescaler = 719;//設(shè)置用來(lái)作為T(mén)IMx時(shí)鐘頻率預(yù)分頻值
- TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//設(shè)置時(shí)鐘分割:TDTS = Tck_tim
- TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計(jì)數(shù)模式
- TIM_TimeBaseInit(TIM2, & TIM_TimeBaseInitStructure);
- // GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE);//改變指定管腳的映射 //pC6
- //PWM初始化 //根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化外設(shè)TIMx
- TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM輸出使能
- TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
- TIM_OC1Init(TIM2,&TIM_OCInitStructure);
- //注意此處初始化時(shí)TIM_OC1Init而不是TIM_OCInit,否則會(huì)出錯(cuò)。因?yàn)楣碳䦷?kù)的版本不一樣。
- TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的預(yù)裝載寄存器
- TIM_Cmd(TIM2,ENABLE);//使能或者失能TIMx外設(shè)
- }
- void pwm(void)
- {
- delay_ms(500);
- TIM_SetCompare1(TIM2, 50);//0度
- delay_ms(1000);
- TIM_SetCompare1(TIM2, 100);//45度
- delay_ms(1000);
- TIM_SetCompare1(TIM2,150);//90度
- delay_ms(1000);
- TIM_SetCompare1(TIM2, 200);//135度
- delay_ms(1000);
- TIM_SetCompare1(TIM2, 250);//180度
- delay_ms(100);
-
- }
復(fù)制代碼 這個(gè)是pwm舵機(jī)函數(shù)(sg90)- #include "HCSR04.h"
- #include "sys.h"
- #include "delay.h"
- /*
- * 函數(shù)名:UltrasonicWave_Configuration
- * 描述 :超聲波模塊的初始化
- * 輸入 :無(wú)
- * 輸出 :無(wú)
- */
- void UltrasonicWave_Configuration(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
- GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC8接TRIG
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //設(shè)為推挽輸出模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化外設(shè)GPIO
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PC9接ECH0
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //設(shè)為輸入
- GPIO_Init(GPIOB,&GPIO_InitStructure);
-
- }
- /*
- * 函數(shù)名:UltrasonicWave_StartMeasure
- * 描述 :開(kāi)始測(cè)距,發(fā)送一個(gè)>10us的脈沖,然后測(cè)量返回的高電平時(shí)間
- * 輸入 :無(wú)
- * 輸出 :無(wú)
- */
- void UltrasonicWave_StartMeasure(void)
- {
- Trig = 1;
- delay_us(15); //延時(shí)20US
- Trig = 0;
- }
復(fù)制代碼 這個(gè)是超聲波模塊函數(shù)
剩下的代碼大家可以根據(jù)情況自行下載
注:我在整個(gè)超聲波控制舵機(jī)代碼運(yùn)行時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題,就是在執(zhí)行到舵機(jī)部分的時(shí)候就一直卡在那里,從硬件上看就是led0不會(huì)跳回到led1,但是有時(shí)可以有時(shí)又不可以,這個(gè)問(wèn)題我也不知道怎么回事,遇到同樣問(wèn)題的大家可以一起解決。
全部程序51hei下載地址:
超聲波控制舵機(jī).7z
(187.93 KB, 下載次數(shù): 39)
2021-4-27 19:37 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|