【cc2541历程】按键控制PWM调光

来源:互联网 发布:知之深爱之切原文阅读 编辑:程序博客网 时间:2024/06/05 10:09

一、简介

本文将介绍如何用S1按键,控制相应的PWM.控制相应的LED.

二、开发平台

编译环境:IAR820.02

协议栈:BLE-CC254x-1.40

代码查看器:Source Insight 3.5

硬件平台:SmartRf 开发板


三、编写声明

作者:爱已oО欠费

相关CC2541群:606444519

淘宝小店:https://item.taobao.com/item.htm?spm=a1z10.3-c-s.w4023-16306486995.5.hdKUUO&id=548576956486
四、实验前提
完成以下博文
【cc2541历程】按键:http://blog.csdn.net/wangjiawu7/article/details/71075395 
五、相关硬件:

六、实验步骤
1)创建pwm.c文件和一个Pwm.h文件
(存放在“F:\2541学习历程\cc2541\按键控制PWM\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source”路径下)


2)编辑pwm.c文件,代码如下:


#include <ioCC2540.h>#include "bcomdef.h"#include "OSAL.h"#include "pwm.h"//PWM设定void PWM_Set(uint8 pwm_p11, uint8 pwm_p10, uint8 pwm_p07, uint8 pwm_p06){    //uint16 radio; uint16 Pwm_Rate;    uint32 pwm_value[4];            if(pwm_p11 == 0 && pwm_p10 == 0 &&  pwm_p07 == 0 &&  pwm_p06 == 0)    {Set_General_Out();}else{    EA=0;    Set_Pwm_Out();   //100Hz   Pwm_Rate = 32000000L / 32L / 100L;////        pwm_value[0] = pwm_p11;    pwm_value[0] = pwm_value[0]*Pwm_Rate/255;    pwm_value[1] = pwm_p10;    pwm_value[1] = pwm_value[1]*Pwm_Rate/255;    pwm_value[2] = pwm_p07;    pwm_value[2] = pwm_value[2]*Pwm_Rate/255;    pwm_value[3] = pwm_p06;    pwm_value[3] = pwm_value[3]*Pwm_Rate/255;    T1CC0L = Pwm_Rate%256;    T1CC0H = Pwm_Rate/256;     T1CC1L = pwm_value[0]%256;     T1CC1H = pwm_value[0]/256; //P1_1    T1CC2L = pwm_value[1]%256;     T1CC2H = pwm_value[1]/256; //P1_0    T1CC3L = pwm_value[2]%256;     T1CC3H = pwm_value[2]/256; //P0_7    T1CC4L = pwm_value[3]%256;     T1CC4H = pwm_value[3]/256; //P0_6    EA=1; }}//设置IO口为普通输出功能    void Set_General_Out(void){        P1SEL &= ~(BV(0)|BV(1));    //设置P1_0,P1_1为GPIO功能        P1DIR |= (BV(0)|BV(1));   //设置P1_0,P1_1为输出管脚        P1    &= ~(BV(0)|BV(1));     //设置P1_0,P1_1输出为0                P0SEL &= ~(BV(6)|BV(7));   // 设置P1_0,P1_1为gpio功能        P0DIR |= ~(BV(6)|BV(7));   // 设置P1_0,P1_1为输出管脚        P0    &= ~(BV(6)|BV(7));  // 设置P1_0,P1_1输出为0}//设置IO口为PWM外设功能voidSet_Pwm_Out(void){    P1DIR|= BV(0)|BV(1);//设置P1_0,P1_1为外设功能    P1SEL|= BV(0)|BV(1);//设置P1_0,P1_1为输出为PWM    P0DIR|= BV(6)|BV(7);//设置P0_6,P0_7为外设功能    P0SEL|= BV(6)|BV(7);//设置P0_6,P0_7为输出为PWM        PERCFG |= 0x40;// Select Timer 1 Alternative 2 location   , p88/*    00: Tick frequency/1    01: Tick frequency/8    10: Tick frequency/32    11: Tick frequency/128    mode: modulo bit[1:0]=10, div: tick/128 bit[3:2]=11 *///Clear output on compare-up, set on compare-down in up-down mode. Otherwise clear output//on compare, set on 0.//Compare mode    T1CTL = 0x0a;   //0x0e    T1CCTL0 = 0x3c;    T1CCTL1 = 0x24;//P1_1    T1CCTL2 = 0x24;//P1_0     T1CCTL3 = 0x24;     T1CCTL4 = 0x24;     T1CNTH = 0xff;//P0_7    T1CNTL = 0xff;//P0_6}



3)编辑pwm.h文件,代码如下:
#ifndef _PWM_H_#define _PWM_H_/*pwm_p11 表示p1.1 输出pwm信号占空比, 注意这个占空比是相对于  0xff的占空比pwm_p10 表示p1.0 输出pwm信号占空比, 注意这个占空比是相对于  0xff的占空比pwm_p07 表示p0.7 输出pwm信号占空比, 注意这个占空比是相对于  0xff的占空比pwm_p06 表示p0.6 输出pwm信号占空比, 注意这个占空比是相对于  0xff的占空比*/void PWM_Set(uint8 pwm_p11, uint8 pwm_p10, uint8 pwm_p07, uint8 pwm_p06);void Set_General_Out(void);voidSet_Pwm_Out(void);#endif




4)在工程中添加相应的pwm.c文件和pwm.h

单击左上角工程SimpleBLEPeripheral.ewp->App->右键->Add-> 
然后选择路径(F:\2541学习历程\cc2541\6.按键控制PWM\BLE-CC254x-1.4.0\Projects\ble\SimpleBLEPeripheral\Source)中添加


2.定义pwm相关事件
1)定义PWM相关事件(SimpleBLEPeripheral.c中)
添加相应的头文件
pwm.h

2)定义一个pwm数组 
uint8  pwm[4];

3)在按键S1函数simpleBLEPeripheral_HandleKeys( uint8 shift, uint8 keys )函数中(SimpleBLEPeripheral.c文件中)
添加一下代码
  //由定时器1产生的8位PWM数值,取值范围为0~255  if ( keys & HAL_KEY_SW_6 )  {  pwm[0] = pwm[0]+50;//每次数值增加50pwm[1] = pwm[1]+50;//每次数值增加50pwm[2] = pwm[2]+50;//每次数值增加50pwm[3] = pwm[3]+50;//每次数值增加50if(pwm[0] ==250)//如果等于250,则清0{pwm[0] = 0;pwm[1] = 0;pwm[2] = 0;pwm[3] = 0;}#if (defined HAL_LCD) && (HAL_LCD == TRUE)        HalLcdWriteStringValue( "Key_Plus[0]:", (uint16)(pwm[0] ), 16,  HAL_LCD_LINE_5 );        HalLcdWriteStringValue( "Key_Plus[1]:", (uint16)(pwm[1] ), 16,  HAL_LCD_LINE_6 );        HalLcdWriteStringValue( "Key_Plus[2]:", (uint16)(pwm[2] ), 16,  HAL_LCD_LINE_7 );        HalLcdWriteStringValue( "Key_Plus[3]:", (uint16)(pwm[3] ), 16,  HAL_LCD_LINE_8 );      #endif // (defined HAL_LCD) && (HAL_LCD == TRUE)   PWM_Set(pwm[0], pwm[1], pwm[2], pwm[3]);  }



七、实验结果

编译,下载 ok.

通过按Smart RF板上的S1键,LED0,LED1由暗到亮逐渐累加.




原创粉丝点击