M051的PWM在工作的时候怎么改变其占空比?
我用的是NuTiny-SDK-M051,程序是基于固件库的。按照例程程序写完后用示波器看能看到PWM波形。但是我想要改占空比的话就不行了。我是使用一个定时器,在callback程序中加上了 DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt); 函数,但是用示波器看PWM的波形并不随着新的sPt参数而变化。想请教一下如何在PWM工作的时候改变占空比? 好象m051的T/C和PWM是分开的,T/C没有产生PWM的功能,产生PWM有专用的PWM硬件,可产生4路16位的PWM和8路8位PWM。
建议:
1。一定要仔细看器件手册
2。先采用直接操作寄存器的方法进行学习
3。积累一定的经验后,再看是否可以使用库
改变PWM占空比:
1。肯定是改写比较寄存器的值
2。任何时间都可以改写,但PWM方式会在一次PWM完成后自动采用新的值(通常采用双缓冲器方式)
以上基本上任何新MCU的PWM都是这样的。 谢谢马老师,我的意思是我只是用一个定时器产生中断然后在中断服务里来该变PWM占空比,其实就是想起到一个定时改变占空比的效果,方便用示波器来看效果。
那我再用直接操作寄存器的方法试试吧。
再次感谢马老师 你还真的把M051当做8051来使用了。
用定时器,配合中断的方法产生PWM是没有办法的办法。有专用的PWM功能为何不用,即简单方便,产生PWM波也准确。
从8051到M051,在水平能力上至少要提高2级,硬件使用要提高,软件编程也要提高的。 在线改变duty cycle 要么用interrupt,要么pwm频率很快的话,只能轮询
当然不在乎pwm忽然来了不确定的周期的话,无所谓,直接改cnr cmr 我的M051PWM没输出,我看了所有 的配置都对的是那的问题
P2_MFP &= ~(P20_AD8_PWM0 |P22_AD10_PWM2);
P2_MFP |= (PWM0|PWM2); //使能P2.0~P2.3为PWM输出
P2_PMD &= ~Px0_PMD; //配置P2.0,P2.2为推挽输出
P2_PMD |= Px0_OUT;
P2_PMD &= ~Px2_PMD;
P2_PMD |= Px2_OUT;
APBCLK |= PWM01_CLKEN|PWM23_CLKEN; //使能PWM0,2时钟
CLKSEL1 = PWM_CLOCK_SOURCE; //选择PWM0,2时钟源HCLK/12MHz
PPRA = PWM_PRESCALAE;//选择PWM0,2时钟预分频
CSRA = PWM_CLOCK_DIVIDER; //选择PWM0,2时钟分频
CNR0A =CNR2A =PWM_CNR_VALUE; //PWM0,2计数值PWM_CNR_VALUE
CMR0A =CMR2A = PWM_CMR_VALUE; //PWM0,2比较值 PWM_CNR_VALUE
CAPENRA=0x00; //禁能捕获功能
PCRA |= 0x00080008 | PWM_OUTPUT_INVERT ; //PWM0,2自动重装载
PIERA|=PWMIE2 //使能PWM0~3中断
|PWMIE0;
NVIC_ISER |= PWMA_INT; //使能PWM0~3中断
POEA = PWM_OUTPUT_ENABLE; //PWM输出使能
PCRA |= PWM_ENABLE; //PWM使能,启动 不知是那里还没有配置到呢
页:
[1]