1nnocet- 发表于 2019-7-22 15:07

【ufun学习】学习篇6:《基础例程5 - 触摸按键控制-PWM》

<div class='showpostmsg'> 本帖最后由 1nnocet- 于 2019-7-22 16:39 编辑

<p><br />
<br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">1nnocet-</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b><br />
《基础例程5 - 触摸按键控制-PWM》</p>

<p>此例程与《基础例程2 - PWM控制》例程比较相似,相同之处是都使用定时器TIM2产生PWM控制RGB灯,区别是该例程加入了触摸按键可以控制输出PWM的占空比从而调整灯的亮度,而例程二是使用随机函数产生的值来生成控制占空比的数值,控制灯的亮度。</p>

<p>下面简单介绍一下该例程的学习动态。</p>

<p>1.首先依旧是外设的初始化,该例程所用到的外设资源大体上相似,相同的部分可以参见学习篇3。这里只介绍触摸按键的初始化,因为这个是与例程二的不同之处。</p>

<p></p>

<p></p>

<p>由原理图可以得知四个按键对应的芯片引脚为PB3、PB4、PC4和PC5四个引脚,所以初始化需要对这四个引脚进行初始化,值得注意的是还需改变指定管脚映射,JTAG-DP 失能 + SW-DP 使能。</p>

<pre>
<code>void TK_GPIO_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);//使能GPIOB、GPIOC及功能复用IO时钟
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //改变指定管脚映射,JTAG-DP 失能 + SW-DP 使能。目的是使PB3的I/O口功能处于可用状态
        //引脚定义
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                //TOUCH0
// 浮空输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        //初始化
        GPIO_Init(GPIOC, &amp;GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                //TOUCH1
        GPIO_Init(GPIOC, &amp;GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                       //TOUCH2
        GPIO_Init(GPIOB, &amp;GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                //TOUCH3
        GPIO_Init(GPIOB, &amp;GPIO_InitStructure);
}</code></pre>

<p>2.下面具体看下main函数,三个led1_brightness变量按照其英文意思大概也能猜到是控制灯亮度的变量。TIM2_PWM_Init(399,0);&nbsp; &nbsp; 初始化定时器TIM2的周期值为399+1,预分频值为0+1,三个TIM_SetCompare1(TIM2,led1_brightness);函数捕获比较值初始化三种灯的初始亮度。while(1)里面由Key_Scan(mode);函数捕获键值,并对相应的led1_brightness操作改变预分频的值进而改变灯的亮度。由led2_brightness=led2_brightness-50;&nbsp; &nbsp; 由&ldquo;led2_brightness=led2_brightness-50;&nbsp;&nbsp; &nbsp;&rdquo;可以看出灯的亮度分为400/50=8档亮度可调。键值1,2,4对应调整三个灯的亮度,键值3可以改变按键模式(点击一次改变一次亮度和长按可连续调整亮度两种模式)。</p>

<pre>
<code>int main()
{
        int key_value,led1_brightness=400,led2_brightness=400,led3_brightness=400;                               //键值
        int mode=0;                                                                                                                                       //按键模式
        LED_Init();                                                                                                                                       //led初始化
        TIM2_PWM_Init(399,0);                                                                                               //pwm初始化
        TK_GPIO_Init();                              //触摸按键初始化
        //led亮度初始化
        TIM_SetCompare1(TIM2,led1_brightness);
        TIM_SetCompare2(TIM2,led2_brightness);
        TIM_SetCompare3(TIM2,led3_brightness);
       
        while (1)                                    
        {                                                 
                key_value=Key_Scan(mode);                  //获取键值
                if(key_value==1)                           //检测到touch0被按下
                {
                        led1_brightness=led1_brightness-50;                      //亮度上升
                        if(led1_brightness==0)
                        {
                                led1_brightness=400;
                        }                               
                        TIM_SetCompare1(TIM2,led1_brightness);   //通过改变占空比改变三色led的亮度
                }
               
                if(key_value==2)                           //检测到touch1被按下
                {
                        led2_brightness=led2_brightness-50;                      //亮度上升
                        if(led2_brightness==0)
                        {
                                led2_brightness=400;
                        }       
                        TIM_SetCompare2(TIM2,led2_brightness);      
                }
               
                if(key_value==4)                           //检测到touch3被按下
                {
                        led3_brightness=led3_brightness-50;             //亮度上升
                        if(led3_brightness==0)
                        {
                                led3_brightness=400;
                        }       
                        TIM_SetCompare3(TIM2,led3_brightness);      
                }
               
                if(key_value==3)                           //检测到touch2被按下
                {                                          
                        if(mode==0)                              //按键模式切换,mode=0为关闭连续按键,mode=1位开启连续按键
                        {                                       
                                mode=1;                              
                                while(TOUCH2);                         //如果按键未抬起,阻塞,直到抬起,防止模式跳变
                        }                                       
                        else                                    
                                mode=0;                              
                }       
        }       
}</code></pre>

<p>3.例程运行效果:可以通过三个按键分别改变三个灯的亮度,一共可以调节八个档位。另一个按键可以改变按键模式。另外还将步进改成了10 即led2_brightness=led2_brightness-10;这样灯的亮度就可以有40档的调节档位,经过验证其可行的。<iframe allowfullscreen="true" frameborder="0" height="450" src="http://player.youku.com/embed/XNDI4MjgxOTI0MA" style="background:#eee;margin-bottom:10px;" width="100%"></iframe></p>

<p>4.后期还会出一个使用按键控制PWM的实战作品,大家可以猜猜具体内容是用于何种作用<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/face-with-stuck-out-tongue-and-tightly-closed-eyes_1f61d.png" width="28" /></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: 【ufun学习】学习篇6:《基础例程5 - 触摸按键控制-PWM》