让找料更便捷
电子元器件
采购信息平台
生意随身带
随时随地找货
一站式电子元器件
采购平台
半导体行业观察第一站
标签:
摘要: PWM即脉宽调制,可用于输出一定占空比的方波。LPC1788有两个PWM,每个PWM可以由6路的输出,PWM1~PWM6。下面介绍使用PWM0.1输出PWM波。 1,PWM使用公共的PCLK,因此要配置系统时钟和外设时钟。之前的文章中有具体的时钟配置过程。 2,使能PWM模块。配置外设功率配置寄存器PCONP,使能PWM0的时钟控制位。 3,PWM0.1的输出管脚和P1_2管脚复
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灯进行示意。
#defineCCLK120000000#definePCLK60000000#definerFIO1DIR(*(volatileunsigned*)(0x20098020))#definerFIO1MASK(*(volatileunsigned*)(0x20098030))#definerFIO1PIN(*(volatileunsigned*)(0x20098034))#definerFIO1SET(*(volatileunsigned*)(0x20098038))#definerFIO1CLR(*(volatileunsigned*)(0x2009803c))#definerCLKSRCSEL(*(volatileunsigned*)(0x400FC10C))//时钟源选择寄存器#definerPLL0CON(*(volatileunsigned*)(0x400FC080))//PLL0控制寄存器#definerPLL0CFG(*(volatileunsigned*)(0x400FC084))//PLL0配置寄存器#definerPLL0STAT(*(volatileunsigned*)(0x400FC088))//PLL0状态寄存器#definerPLL0FEED(*(volatileunsigned*)(0x400FC08C))//PLL0馈送寄存器#definerPLL1CON(*(volatileunsigned*)(0x400FC0A0))#definerPLL1CFG(*(volatileunsigned*)(0x400FC0A4))#definerPLL1STAT(*(volatileunsigned*)(0x400FC0A8))#definerPLL1FEED(*(volatileunsigned*)(0x400FC0AC))#definerCCLKSEL(*(volatileunsigned*)(0x400FC104))//CPU时钟选择寄存器#definerUSBCLKSEL(*(volatileunsigned*)(0x400FC108))//USB时钟选择寄存器#definerPCLKSEL(*(volatileunsigned*)(0x400FC1A8))//外设时钟寄存器#definerPCON(*(volatileunsigned*)(0x400FC0C0))#definerPXCONP(*(volatileunsigned*)(0x400FC0C4))#definerSCS(*(volatileunsigned*)(0x400FC1A0))//系统控制和状态寄存器#definerCLKOUTCFG(*(volatileunsigned*)(0x400FC1C8))#definerIOCON_P1_02(*(volatileunsigned*)(0x4002C088))#definerPCONP(*(volatileunsigned*)(0x400FC0C4))#definerPWM0IR(*(volatileunsigned*)(0x40014000))#definerPWM0TCR(*(volatileunsigned*)(0x40014004))#definerPWM0TC(*(volatileunsigned*)(0x40014008))#definerPWM0PR(*(volatileunsigned*)(0x4001400C))#definerPWM0CTCR(*(volatileunsigned*)(0x40014070))#definerPWM0MCR(*(volatileunsigned*)(0x40014014))#definerPWM0MR0(*(volatileunsigned*)(0x40014018))#definerPWM0MR1(*(volatileunsigned*)(0x4001401C))#definerPWM0CCR(*(volatileunsigned*)(0x40014028))#definerPWM0PCR(*(volatileunsigned*)(0x4001404C))#definerPWM0LER(*(volatileunsigned*)(0x40014050))#definerISER1(*(volatileunsigned*)(0xE000E104))#definerCER1(*(volatileunsigned*)(0xE000E184))unsignedintduty=10;unsignedcharmatch_cnt=0;voidPWM0_IRQHandler(void){if(rPWM0IR&0x1){rFIO1PIN|=(1<<18);match_cnt++;rPWM0IR|=0x1;//MR0中断复位}if(rPWM0IR&(0x1<<1)){rFIO1PIN&=~(1<<18);rPWM0IR|=0x1<<1;//MR1中断复位}}voidSystemInit(){rSCS&=~(0x1<<4);//频率12MrSCS|=(0x1<<5);//使能主振荡器while(0==(rSCS&(0x1<<6)));//等待主振荡器稳定rCLKSRCSEL=0x1;rPLL0CFG=0x9;//配置CCLK=120MrPLL0CON=0x01;rPLL0FEED=0xAA;rPLL0FEED=0x55;while(0==(rPLL0STAT&(0x1<<10)));rCCLKSEL=(0x1|(0x1<<8));rPCLKSEL=0x2;//配置PCLK=60MrCLKOUTCFG=0x0|(0xb<<4)|(0x1<<8);}voidPWMInit(){rIOCON_P1_02&=~0x7;rIOCON_P1_02|=0x3;//P1.02配置成PWM0[1]rPCONP|=0x1<<5;//使能PWM0外设rPWM0IR=0x73F;//初始化PWM相关控制寄存器rPWM0TCR=0;rPWM0CTCR=0;rPWM0MCR=0;rPWM0CCR=0;rPWM0PCR=0;rPWM0LER=0;rPWM0PR=0x1<<20;//每0x1<<20+1个PLCK上升沿,TC递增rPWM0TCR|=0x1<<1;//复位TC和PCrPWM0TCR&=~(0x1<<1);rPWM0MR0=100;rPWM0LER|=0x1;rPWM0MCR|=0x1<<1|0x1;//MR0和TC匹配时复位TC和PC.并且产生中断rPWM0MR1=duty;rPWM0LER|=0x1<<1;rPWM0MCR|=0x1<<3;//MR1和TC匹配时产生中断}intmain(){PWMInit();rFIO1DIR|=(0x1<<18);rISER1|=0x1<<7;//PWM0中断使能rPWM0TCR|=0x1<<1;//复位TC和PCrPWM0TCR&=~(0x1<<1);rPWM0TCR|=0x1;//PC和TC计数使能rPWM0TCR|=0x1<<3;//PWM模式使能while(1){if(match_cnt>=1){match_cnt=0;duty=duty+10;if(duty>=100){duty=0;}rPWM0MR1=duty;rPWM0LER|=0x1<<1;rPWM0MCR|=0x1<<3;}}return1;}上一篇:已经是第一篇
型号 | 厂商 | 价格 |
---|---|---|
EPCOS | 爱普科斯 | / |
STM32F103RCT6 | ST | ¥461.23 |
STM32F103C8T6 | ST | ¥84 |
STM32F103VET6 | ST | ¥426.57 |
STM32F103RET6 | ST | ¥780.82 |
STM8S003F3P6 | ST | ¥10.62 |
STM32F103VCT6 | ST | ¥275.84 |
STM32F103CBT6 | ST | ¥130.66 |
STM32F030C8T6 | ST | ¥18.11 |
N76E003AT20 | NUVOTON | ¥9.67 |