|
<p>c8051单片机输出PWM波形的频率怎么设定</p>
<p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:10 -</p>
<p>解决时间:2010-9-27 10:10</p>
<p>我用的c8051f040单片机,想要编程实现PWM波形的输出,想请教PWM波的频率怎么编程设定,最好有程序,谢谢</p>
<p>提问者: 水225 - 二级</p>
<p>最佳答案</p>
<p>具体可以使用三个方式,一个是通过DAC 进行对外输出PWM 或者通过PCA通过IO输出PWM的还可以直接用定时器来实现 程序我给你找找 我以前写过的</p>
<p>/*********************************************************************</p>
<p>* pca实现8位PWM</p>
<p>* * 编写环境KC3.0</p>
<p>* 作者:孔聆宇</p>
<p>***********************************************************************/</p>
<p>//--------------------------------------------------------------------</p>
<p>// PWM8_1.c</p>
<p>//--------------------------------------------------------------------</p>
<p>//</p>
<p>// AUTH: BW</p>
<p>//</p>
<p>//</p>
<p>//</p>
<p>// 说明</p>
<p>// 实现8位PWM的示例代码</p>
<p>// PCA被配置为8位PWM方式 使用SYSCLK/4作为时基信号</p>
<p>// <PWM>中保持着每256个计数周期内输出波形为低电平的PCA周期数</p>
<p>// 波形为高电平的时间占 256 - PWM 个周期</p>
<p>// 输出波形的占空度=(256 - PWM)/256</p>
<p>//</p>
<p>// 由于该8位PWM完全受硬件控制 不需要额外的CPU周期来维持固定的</p>
<p>// 占空度 在本例中 改变占空度只需要向模块的比较寄存器PCA0CP0H</p>
<p>// 的高字节写一个8位数</p>
<p>//</p>
<p>// 可以达到的占空度范围是0.38%(PCA0CP0H = 0xff)</p>
<p>// 到100%(PCA0CP0H = 0x00)</p>
<p>//</p>
<p>//--------------------------------------------------------------------</p>
<p>//-----------------------------------------------------------------------------</p>
<p>// Includes</p>
<p>//-----------------------------------------------------------------------------</p>
<p>#include <c8051f040.h> // SFR declarations</p>
<p>//-----------------------------------------------------------------------------</p>
<p>// Global Constants</p>
<p>//-----------------------------------------------------------------------------</p>
<p>#define SYSCLK 2211810 // Internal oscillator frequency in Hz</p>
<p>//-----------------------------------------------------------------------------</p>
<p>// Function Prototypes</p>
<p>//-----------------------------------------------------------------------------</p>
<p>void OSCILLATOR_Init (void);</p>
<p>void PORT_Init (void);</p>
<p>void PCA0_Init (void);</p>
<p>//-----------------------------------------------------------------------------</p>
<p>// main() Routine</p>
<p>//-----------------------------------------------------------------------------</p>
<p>void main (void)</p>
<p>{</p>
<p>unsigned int delay_count;</p>
<p>bit duty_direction = 0;</p>
<p>WDTCN = 0xde;</p>
<p>WDTCN = 0xad;</p>
<p>PORT_Init ();</p>
<p>OSCILLATOR_Init ();</p>
<p>PCA0_Init ();</p>
<p>SFRPAGE = PCA0_PAGE;</p>
<p>while (1)</p>
<p>{</p>
<p>for (delay_count = 30000; delay_count > 0; delay_count--);</p>
<p>if (duty_direction == 1)</p>
<p>{</p>
<p>if ((PCA0CPM0 & 0x40) == 0x00)</p>
<p>{</p>
<p>PCA0CPM0 I= 0x40;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>PCA0CPH0--;</p>
<p>if (PCA0CPH0 == 0x00)</p>
<p>{</p>
<p>duty_direction = 0;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>if (PCA0CPH0 == 0xFF)</p>
<p>{</p>
<p>PCA0CPM0 &= ~0x40;</p>
<p>duty_direction = 1;</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>PCA0CPH0++;</p>
<p>}</p>
<p>}</p>
<p>};</p>
<p>}</p>
<p>void OSCILLATOR_Init (void)</p>
<p>{</p>
<p>char SFRPAGE_save = SFRPAGE;</p>
<p>SFRPAGE = CONFIG_PAGE;</p>
<p>OSCICN = 0x83;</p>
<p>CLKSEL = 0x00;</p>
<p>SFRPAGE = SFRPAGE_save;</p>
<p>}</p>
<p>void PORT_Init (void)</p>
<p>{</p>
<p>char SFRPAGE_save = SFRPAGE;</p>
<p>SFRPAGE = CONFIG_PAGE;</p>
<p>XBR0 = 0x08;</p>
<p>XBR1 = 0x00;</p>
<p>XBR2 = 0x40;</p>
<p>P0MDOUT I= 0x01;</p>
<p>SFRPAGE = SFRPAGE_save;</p>
<p>}</p>
<p>void PCA0_Init (void)</p>
<p>{</p>
<p>char SFRPAGE_save = SFRPAGE;</p>
<p>SFRPAGE = PCA0_PAGE;</p>
<p>PCA0CN = 0x00;</p>
<p>PCA0MD = 0x08;</p>
<p>PCA0CPM0 = 0x42;</p>
<p>PCA0CPH0 = 256 - (256 * 0.5);</p>
<p>CR = 1;</p>
<p>SFRPAGE = SFRPAGE_save;</p>
<p>}</p>
<p>太多还有其他的写不下 这是比较简单的一种。</p>
<p>0</p>
<p>回答者:</p>
<p>孔聆宇 - 二级 2010-9-25 10:36</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>非常感谢你的帮助,能把你的程序资料给我发一份么,我邮箱:youlilhg225@163.com</p>
|
|