stm32F4应用笔记(一)利用蜂鸣器制作的超声波自拍神器

来源:互联网 发布:网络保密八个严禁 编辑:程序博客网 时间:2024/04/27 18:13

简单介绍

超声波自拍神器就是一个用来自拍的东西,下面是一个网页上的广告:
http://it007.com/thread-1699349-1-1.html
简单说就是,如果有一个自拍杆,然后想要自拍的时候,按下开关,然后发出一个超声波,手机接收到了之后就会拍照了——此外,我们还需要下载一个手机APP,叫做Airshooting。

参考资料

我是在某位大神的博客上看到有这么个东西的。
地址如下:
http://www.cirmall.com/circuit/1484/(ST大赛三等奖作品)超声波自拍神器#/details?2

方案介绍

首先手机先到网上下载一个APP(Airshooting),然后打开APP,利用STM32 NUCLEO-F072RB开发板的定时器产生一定频率PWM信号,用来控制蜂鸣器发出声音,当手机接收到蜂鸣器发出的声音后,会执行拍张操作,如果你的手机有前摄像头,还可以控制手机执行切换摄像头操作。

(1)拍照的PWM频率为:先发送250ms的频率为15870Hz的PWM信号(占空比没什么要求,50%左右即可);后发送250ms的频率为15617Hz的PWM信号。这个频率精确度越高,控制的距离就越远。
(2)切换的PWM频率为:先发送250ms的频率为16526Hz的PWM信号(占空比没什么要求,50%左右即可);后发送250ms的频率为15620Hz的PWM信号。

实物图

我也是拿面包板搭建的电路,用的是正点原子的STM32F4开发板。
因为我用的是开发板,所以很多代码都是现成的,自己需要改的部分很少。用的是TIM14_CH1通过PF9端口输出PWM信号。蜂鸣器串联了一个1K电阻,然后一端连着PF9引脚,另一端接地。电路非常简单。
这里写图片描述

主要的代码片段

PWM的频率和占空比公式
频率:
//Fpwm = 时钟频率 / ((arr+1)*(psc+1))(单位:Hz)
占空比:
//duty circle = TIMxx->CCR1 / arr(单位:%)

int main(void){      Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz     delay_init(168);            //延时初始化      KEY_Init();  //按键初始化        while(1)    {        u8 flag=0;         flag=KEY_Scan(0);        if(flag==2)        {            /******拍照信号******/            TIM14_PWM_Init(63-1,84-1);            delay_ms(250);   //先发送250ms的频率为15870Hz的PWM信号(占空比没什么要求,50%左右即可);            TIM14_PWM_Init(64-1,84-1);            delay_ms(250);              //后发送250ms的频率为15617Hz的PWM信号。            RCC->APB1ENR|=0<<8;     //TIM14时钟关闭                     flag=0;  //标志清零            //delay_ms(5000);        }        if(flag==3)        {            /******切换镜头信号******/            TIM14_PWM_Init(60-1,84-1);            delay_ms(250);               //先发送250ms的频率为16526Hz的PWM信号;            TIM14_PWM_Init(64-1,84-1);            delay_ms(250);              //后发送250ms的频率为15620Hz的PWM信号。            RCC->APB1ENR|=0<<8;     //TIM14时钟关闭                 flag=0;  //标志清零                     //delay_ms(5000);        }    }}//TIM14 PWM部分初始化 //PWM输出初始化//arr:自动重装值//psc:时钟预分频数void TIM14_PWM_Init(u32 arr,u32 psc){                                //此部分需手动修改IO口设置    RCC->APB1ENR|=1<<8;     //TIM14时钟使能        RCC->AHB1ENR|=1<<5;     //使能PORTF时钟     GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出    GPIO_AF_Set(GPIOF,9,9); //PF9,AF9     TIM14->ARR=arr;         //设定计数器自动重装值     TIM14->PSC=psc;         //预分频器不分频     TIM14->CCMR1|=6<<4;     //CH1 PWM1模式             TIM14->CCMR1|=1<<3;     //CH1 预装载使能        TIM14->CCER|=1<<0;      //OC1 输出使能      TIM14->CCER|=1<<1;      //OC1 低电平有效        TIM14->CR1|=1<<7;       //ARPE使能     TIM14->CR1|=1<<0;       //使能定时器14    TIM14->CCR1=arr*0.5;    //占空比= TIM14->CCR1 / arr(单位:%)//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//0,没有任何按键按下//1,KEY0按下//2,KEY1按下//3,KEY2按下 //4,KEY_UP按下 即WK_UP//注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY_UP!!u8 KEY_Scan(u8 mode){        static u8 key_up=1;//按键按松开标志    if(mode)key_up=1;  //支持连按             if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))    {        delay_ms(10);//去抖动         key_up=0;        if(KEY0==0)return 1;        else if(KEY1==0)return 2;        else if(KEY2==0)return 3;        else if(WK_UP==1)return 4;    }else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;          return 0;// 无按键按下}

遇到的问题

大神博客中说的切换前后摄像头的哪一部分有问题,我没法实现,频率不对——也有可能是我的硬件部分有问题。但是拍照那一部分是可以实现的。

0 0
原创粉丝点击