【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, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TOUCH1
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //TOUCH2
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //TOUCH3
GPIO_Init(GPIOB, &GPIO_InitStructure);
}</code></pre>
<p>2.下面具体看下main函数,三个led1_brightness变量按照其英文意思大概也能猜到是控制灯亮度的变量。TIM2_PWM_Init(399,0); 初始化定时器TIM2的周期值为399+1,预分频值为0+1,三个TIM_SetCompare1(TIM2,led1_brightness);函数捕获比较值初始化三种灯的初始亮度。while(1)里面由Key_Scan(mode);函数捕获键值,并对相应的led1_brightness操作改变预分频的值进而改变灯的亮度。由led2_brightness=led2_brightness-50; 由“led2_brightness=led2_brightness-50; ”可以看出灯的亮度分为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]