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

一、简介

本文将介绍如何用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 
五、相关硬件:
【cc2541历程】按键控制PWM调光_第1张图片【cc2541历程】按键控制PWM调光_第2张图片

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

【cc2541历程】按键控制PWM调光_第3张图片

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


#include 
#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外设功能

void	Set_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);
void	Set_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)中添加
【cc2541历程】按键控制PWM调光_第4张图片

【cc2541历程】按键控制PWM调光_第5张图片
2. 定义pwm相关事件
1)定义PWM相关事件(SimpleBLEPeripheral.c中)
添加相应的头文件
pwm.h
【cc2541历程】按键控制PWM调光_第6张图片
2)定义一个pwm数组 
uint8  pwm[4];
【cc2541历程】按键控制PWM调光_第7张图片
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;		//每次数值增加50
	pwm[1] = pwm[1]+50;		//每次数值增加50	
	pwm[2] = pwm[2]+50;		//每次数值增加50
	pwm[3] = pwm[3]+50;		//每次数值增加50	
	
	if(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由暗到亮逐渐累加.




你可能感兴趣的:(【cc2541历程】按键控制PWM调光)