Cortex-M3 (NXP LPC1788)之PWM

发布者:SereneWanderer最新更新时间:2016-05-26 来源: eefocus关键字:Cortex-M3  NXP  LPC1788  PWM 手机看文章 扫描二维码
随时随地手机看文章
        PWM即脉宽调制,可用于输出一定占空比的方波。LPC1788有两个PWM,每个PWM可以由6路的输出,PWM1~PWM6。下面介绍使用PWM0.1输出PWM波。

        1,PWM使用公共的PCLK,因此要配置系统时钟和外设时钟。之前的文章中有具体的时钟配置过程。

        2,使能PWM模块。配置外设功率配置寄存器PCONP,使能PWM0的时钟控制位。

        3,PWM0.1的输出管脚和P1_2管脚复用,因此要配置IOCON_P1_02寄存器,将其设置成PWM0.1的输出。

        4,设置PWM的脉冲宽度,基本的原理就是比较PWM定时器计数器TC和匹配寄存器MR中的值,如果匹配我们可以通过匹配控制寄存器MCR选择操作,如产生一个中断,复位TC,停止TC和预分频计数器PC且停止计数。匹配寄存器MR0通过在匹配是将计数器TC复位来控制PWM的周期频率。另一个匹配寄存器控制PWM沿的位置。如PWM0.1的输出,将使用MR0控制PWM的周期频率,MR1控制边沿的位置。

        5,最后是对于PWM的具体控制,配置PWM预分频寄存器PWMPR,该32位寄存器规定了PWM预分频计数的最大值,PWM预分频计数器寄存器PWMPC在每个PCLK上递增一次,当PWMPC和PWMPR值相等时,PWMTC的值会递增,而PWMPR在系一个PCLK周期被复位。这样,当PWMPR=0时,PWMTC会在每个PCLK上递增,而当PWMPR=1时,在每2个PCLK上递增。匹配寄存器PWMMR中的值和PWMTC的值比较,如果相等则触发在PWMMCR中配置的操作。当MR0和TC相等时,我们进行复位TC从新计数从而固定了PWM的周期频率。当定时器处于PWM模式时,软件对PWM匹配寄存器MR的写操作,写入值实际上被保存在一个映像寄存器中,不会被立即使用。所以在我们需要操作PWM锁存使能寄存器PWMLER,典型序列为:将新值写入MR,写PWMLER中相应的位,更改的MR值将在下一次定时器复位时生效。

        在下面的程序中,将给MR1中写入不同的匹配值,来控制PWM的占空比。为了方便使用LED灯进行示意。

  1. #define CCLK        120000000  
  2. #define PCLK         60000000  
  3.   
  4. #define rFIO1DIR    (*(volatile unsigned*)(0x20098020))  
  5. #define rFIO1MASK   (*(volatile unsigned*)(0x20098030))  
  6. #define rFIO1PIN    (*(volatile unsigned*)(0x20098034))  
  7. #define rFIO1SET    (*(volatile unsigned*)(0x20098038))  
  8. #define rFIO1CLR    (*(volatile unsigned*)(0x2009803c))  
  9.   
  10. #define rCLKSRCSEL  (*(volatile unsigned *)(0x400FC10C))     //时钟源选择寄存器    
  11. #define rPLL0CON    (*(volatile unsigned *)(0x400FC080))     //PLL0控制寄存器    
  12. #define rPLL0CFG    (*(volatile unsigned *)(0x400FC084))     //PLL0配置寄存器    
  13. #define rPLL0STAT   (*(volatile unsigned *)(0x400FC088))     //PLL0状态寄存器    
  14. #define rPLL0FEED   (*(volatile unsigned *)(0x400FC08C))     //PLL0馈送寄存器    
  15. #define rPLL1CON    (*(volatile unsigned *)(0x400FC0A0))         
  16. #define rPLL1CFG    (*(volatile unsigned *)(0x400FC0A4))    
  17. #define rPLL1STAT   (*(volatile unsigned *)(0x400FC0A8))    
  18. #define rPLL1FEED   (*(volatile unsigned *)(0x400FC0AC))    
  19. #define rCCLKSEL    (*(volatile unsigned *)(0x400FC104))     //CPU时钟选择寄存器    
  20. #define rUSBCLKSEL  (*(volatile unsigned *)(0x400FC108))     //USB时钟选择寄存器    
  21. #define rPCLKSEL    (*(volatile unsigned *)(0x400FC1A8))     //外设时钟寄存器    
  22. #define rPCON       (*(volatile unsigned *)(0x400FC0C0))    
  23. #define rPXCONP     (*(volatile unsigned *)(0x400FC0C4))    
  24. #define rSCS        (*(volatile unsigned *)(0x400FC1A0))     //系统控制和状态寄存器    
  25. #define rCLKOUTCFG  (*(volatile unsigned *)(0x400FC1C8))  
  26.   
  27. #define rIOCON_P1_02    (*(volatile unsigned *)(0x4002C088))  
  28. #define rPCONP      (*(volatile unsigned *)(0x400FC0C4))  
  29.   
  30. #define rPWM0IR     (*(volatile unsigned *)(0x40014000))  
  31. #define rPWM0TCR    (*(volatile unsigned *)(0x40014004))  
  32. #define rPWM0TC     (*(volatile unsigned *)(0x40014008))  
  33. #define rPWM0PR     (*(volatile unsigned *)(0x4001400C))  
  34. #define rPWM0CTCR   (*(volatile unsigned *)(0x40014070))  
  35. #define rPWM0MCR    (*(volatile unsigned *)(0x40014014))  
  36. #define rPWM0MR0    (*(volatile unsigned *)(0x40014018))  
  37. #define rPWM0MR1    (*(volatile unsigned *)(0x4001401C))  
  38. #define rPWM0CCR    (*(volatile unsigned *)(0x40014028))  
  39. #define rPWM0PCR    (*(volatile unsigned *)(0x4001404C))  
  40. #define rPWM0LER    (*(volatile unsigned *)(0x40014050))  
  41.   
  42. #define rISER1      (*(volatile unsigned *)(0xE000E104))  
  43. #define rCER1       (*(volatile unsigned *)(0xE000E184))  
  44.   
  45. unsigned int duty = 10;  
  46. unsigned char match_cnt = 0;  
  47.   
  48. void PWM0_IRQHandler(void)  
  49. {  
  50.     if(rPWM0IR&0x1)  
  51.     {  
  52.         rFIO1PIN |= (1<<18);  
  53.         match_cnt++;  
  54.         rPWM0IR |= 0x1;     //MR0中断复位  
  55.     }  
  56.       
  57.     if(rPWM0IR&(0x1<<1))  
  58.     {  
  59.         rFIO1PIN &= ~(1<<18);  
  60.         rPWM0IR |= 0x1<<1;  //MR1中断复位  
  61.     }  
  62. }  
  63.   
  64. void SystemInit()    
  65. {    
  66.     rSCS &= ~(0x1<<4);                //频率12M    
  67.     rSCS |= (0x1<<5);             //使能主振荡器    
  68.     while(0 == (rSCS & (0x1<<6)));//等待主振荡器稳定    
  69.         
  70.     rCLKSRCSEL = 0x1;    
  71.         
  72.     rPLL0CFG = 0x9;                 //配置CCLK = 120M    
  73.     rPLL0CON = 0x01;    
  74.     rPLL0FEED = 0xAA;    
  75.     rPLL0FEED =0x55;    
  76.     while( 0 == (rPLL0STAT & (0x1<<10)));     
  77.         
  78.     rCCLKSEL = (0x1 | (0x1<<8));    
  79.     rPCLKSEL = 0x2;                 //配置PCLK = 60M    
  80.         
  81.     rCLKOUTCFG = 0x0 | (0xb<<4) | (0x1<<8);    
  82. }   
  83.   
  84.   
  85. void PWMInit()  
  86. {  
  87.     rIOCON_P1_02 &= ~0x7;  
  88.     rIOCON_P1_02 |= 0x3;    //P1.02配置成PWM0[1]  
  89.       
  90.     rPCONP |= 0x1<<5;     //使能PWM0外设  
  91.       
  92.     rPWM0IR = 0x73F;    //初始化PWM相关控制寄存器  
  93.     rPWM0TCR = 0;  
  94.     rPWM0CTCR = 0;  
  95.     rPWM0MCR = 0;  
  96.     rPWM0CCR = 0;  
  97.     rPWM0PCR = 0;  
  98.     rPWM0LER = 0;  
  99.       
  100.     rPWM0PR = 0x1<<20;    //每0x1<<20+1个PLCK上升沿,TC递增  
  101.     rPWM0TCR |= 0x1<<1;   //复位TC和PC  
  102.     rPWM0TCR &= ~(0x1<<1);  
  103.       
  104.     rPWM0MR0 = 100;  
  105.     rPWM0LER |= 0x1;  
  106.     rPWM0MCR |= 0x1<<1 | 0x1;     //MR0和TC匹配时复位TC和PC.并且产生中断  
  107.       
  108.     rPWM0MR1 = duty;  
  109.     rPWM0LER |= 0x1<<1;  
  110.     rPWM0MCR |= 0x1<<3;   //MR1和TC匹配时产生中断  
  111. }  
  112.   
  113. int main ()  
  114. {  
  115.     PWMInit();  
  116.       
  117.     rFIO1DIR |= (0x1<<18);  
  118.     rISER1 |= 0x1<<7; //PWM0中断使能  
  119.       
  120.     rPWM0TCR |= 0x1<<1;   //复位TC和PC  
  121.     rPWM0TCR &= ~(0x1<<1);  
  122.       
  123.     rPWM0TCR |= 0x1;    //PC和TC计数使能  
  124.     rPWM0TCR |= 0x1<<3; //PWM模式使能  
  125.       
  126.     while(1)  
  127.     {  
  128.         if(match_cnt >= 1)  
  129.         {  
  130.             match_cnt = 0;  
  131.             duty = duty+10;  
  132.             if(duty >= 100)  
  133.             {  
  134.                 duty  = 0;  
  135.             }  
  136.             rPWM0MR1 = duty;  
  137.             rPWM0LER |= 0x1<<1;  
  138.             rPWM0MCR |= 0x1<<3;  
  139.         }  
  140.     }  
  141.     return 1;  
  142. }  
        程序在MR0匹配时复位TC,在MR1匹配时触发边沿。可以看到随着MR1匹配值的改变,LED灯的亮灭时间对应改变。(程序中的预分频寄存器PR设置为了让LED效果明显)

 

        LPC1788的PWM可以进行双边沿的控制。如PWM0.2可以用MR0控制PWM的周期频率,用MR1和MR2控制PWM0.2的边沿。

关键字:Cortex-M3  NXP  LPC1788  PWM 引用地址:Cortex-M3 (NXP LPC1788)之PWM

上一篇:Cortex-M3 (NXP LPC1788)之UART用法
下一篇:Cortex-M3 (NXP LPC1788)之外部中断操作

推荐阅读最新更新时间:2024-03-16 14:55

Cortex-M3向量表
Cortex-M3支持大量的中断和异常,其中包括CM3固有的和芯片本身所特有的,具体有多少个中断得由芯片制造商决定。 向量表: 向量表其实是一个word(32位)型数组,其中每一项代表一种异常的起始地址,当有异常发生时,相应的异常处理函数将被执行。向量表是可以重定位的,重定位由NVIC来控制。复位时,重定位控制寄存器初始值为0,所以在复位时,向量表必须存放在0地址处。向量表定义如下: 复位时序: 当处理器复位之后,会从存储器中读取两个word的数据。地址0x00000000数据为SP(栈寄存器)初始值,地址0x00000004数据为程序的起始地址,也就是说复位之后,程序将从该处开始执行。例如:
[单片机]
<font color='red'>Cortex-M3</font>向量表
stm32 通用定时器与 PWM
通用定时器(以下以通用定时器3,通道3 为例): 第一步:开启时钟使能 RCC- APB1ENR:1 位 //开启定时器3 时钟使能 第二步:设置定时器分频与装载计数值(以一周期 1ms) TIM3- PSC = 7199; //系统时钟为 72M 经 (7199+1) 分频后,定时器时钟为 10k(一周期为0.1ms) TIM3- ARR = 9; //计数周期为 0.1ms * (9+1) = 1ms 第三步:使能定时器 TIM3- CR1:0 位 //开启计数器,开始计时 第四步:溢出中断使能 TIM3- DIER:0 位 //开启溢出中断 第五步: void TIM3_IRQHandler(void); 利用通用定时
[单片机]
STM8 tim1 ch1 PWM输出
// 函数功能:初始化定时器1 的通道1,用于控制LED 的亮度 // 输入参数:无 // 输出参数:无 // 返回值:无 // 备注:无 void Tim1_Init() { /* Set the Autoreload value */ TIM1- ARRH = (uint8_t)(1000 8); //2M/1000=2K TIM1- ARRL = (uint8_t)(1000); /* Set the Prescaler value */ TIM1- PSCRH = 0x00; //8分频 16M/8=2M TIM1- PSCRL = 0x08; TIM1- CCR1
[单片机]
恩智浦为汽车启停系统提供突破性AB类和D类音频放大器
• 新型放大器为节能汽车提供不间断的车载娱乐体验 • 恩智浦率先同时量产符合6V电压标准的AB类和D类放大器 中国上海,2011年10月21日 —— 恩智浦半导体NXP Semiconductors N.V. (NASDAQ:NXPI) 近日宣布其两款面向节能汽车启停系统的新型汽车音频放大器 —— TDF8530和TDF8546开始供货。TDF8530是一款能效超高的4通道D类音频放大器,支持启停车辆的6V电压标准。TDF8546则是一款4通道AB类放大器,具有突破性最佳能效模式 (Best Efficiency Mode) , 可在低至6V的电压下正常工作,相比其他同级别高能效解决方案降低了17%的功耗。在混合动力电动汽车、微
[汽车电子]
基于STM32的嵌入式双目图像采集系统设计
1 引言 随着图像处理技术及嵌入式系统的发展,利用嵌入式系统进行图像处理,已使如视频监控、视频电话和视频会议等应用成为可能。嵌入式系统上进行图像采集则是实现这些应用的前提[1~2]。 双目立体视觉通常由两个摄像头从两个不同的角度,同时获取外界物体的两幅图像,或由单独一个摄像头在不同时间、不同位置获取外界物体的两幅图像,并基于视差的原理来获取外界物体的三维几何信息,复现外界物体的形状和位置。 目前已有很多方案实现在嵌入式平台上的图像采集。本文基于嵌入式的图像采集系统选择了意法半导体(ST)公司生产的STM32F103ZET6芯片为主控芯片,FIFO结构的AL422B芯片实现图像数据缓存,SD卡实现图像存储以及四线制电阻触摸屏实
[单片机]
基于STM32的嵌入式双目图像采集系统设计
恩智浦推出集成PFC和谐振控制器的绿色芯片
    恩智浦半导体(NXP Semiconductors)近日宣布推出绿色芯片TEA1713半桥谐振转换器——这是业界首款将功率因数校正(PFC)、容性模式保护和自适应式死区时间控制等多种功能集成于一体的谐振控制器。高性能绿色芯片TEA1713可以构筑性价比极高的电源解决方案,帮助设计人员打造出效率和可靠性俱佳的谐振电源,其典型应用包括90W以上的液晶电视电源、等离子电视电源、个人电脑电源和超薄型电源适配器,以及优质工业及医疗用电源等。     采用绿色芯片TEA1713构成的半桥谐振转换器符合能源之星的要求,在高功率应用场合,其能效高达90%以上,而功耗仅相当于普通反激转换器的一半。除此以外,该芯片提供强大的保护功能
[电源管理]
恩智浦将AWS云服务扩展至S32车用MCU平台
恩智浦将 AWS 云服务扩展到 S32 汽车 MCU 和处理器平台,为新型车辆架构提供灵活的云连接服务。 恩智浦半导体已在其 S32 微控制器 (MCU) 和处理器计算平台上扩展了对安全云连接的支持。 针对车身、区域控制和电气化应用,恩智浦已将 Amazon Web Services (AWS) 云服务集成到其 S32K3 汽车 MCU 中,从而平衡性能和功效,同时应对当今和未来的连接安全和安全挑战。 凭借支持 AWS IoT Core 的 FreeRTOS 库,具有集成云连接功能的 S32K3 缩短了软件定义汽车 (SDV) 的开发时间。它们安全地连接到云,提供车辆数据驱动的见解和服务和无线 (OTA) 更新,以及 S3
[汽车电子]
NXP半导体任命Peter Bonfield爵士为监事会主席
新任主席携 40年科技领域经验加入NXP 中国 , 北京 - NXP半导体日前宣布任命Peter Bonfield爵士为 NXP监事会主席,Bonfield先生为前任英国电信公司(BT plc) 董事长及ICL plc (现为 Fujitsu Services) 总裁暨董事长。 依据荷兰公司法, NXP是由理事会与监事会组成的两层式董事会架构,万豪敦为首席执行官暨理事会主席,Peter Bonfield爵士则为监事会主席。 “我们非常高兴延揽专业经验丰富且业界地位崇高的 Peter爵士加入我们的监事会担任主席,这项任命充分展现出我们努力在新独立的组织中建立良好的公司治理承诺,以及我们决心建立NX
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved