打印

如何用c8051 22.1184M 产生50KHZ,占空比可调的PWM波?

[复制链接]
6404|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
ayb_ice| | 2011-9-16 16:51 | 只看该作者
用配置向导配置PCA即可

使用特权

评论回复
板凳
zhuyi2576|  楼主 | 2011-9-19 23:33 | 只看该作者
产生不了呀,哪位知道如何产生这个频率的波呢,如何计算的,3Q

使用特权

评论回复
地板
心静自然凉| | 2011-9-20 00:52 | 只看该作者
你要配置好PCA的有关参数,
Fpwm=Fpca/256 =50K

你这里应该是让一个8Bit计数器全部记满才动作,时间当然会很长,能产生的频率也就跟着变低了,所以,你再仔细看下手册有关PCA那部分内容,计算并设置好有关寄存器。

使用特权

评论回复
5
zhuyi2576|  楼主 | 2011-9-20 20:54 | 只看该作者
不是时间会变长,而是一二个周期定时器就要益出一次,这几乎做不到呀
而且这样的话,那单片机什么也做不了了,只能在那输出Pwm波了

使用特权

评论回复
6
ayb_ice| | 2011-9-20 21:03 | 只看该作者
不是时间会变长,而是一二个周期定时器就要益出一次,这几乎做不到呀
而且这样的话,那单片机什么也做不了了,只能在那输出Pwm波了
zhuyi2576 发表于 2011-9-20 20:54

C8051是单周期51,而且是硬件PWM模块,只要配置一下就行了

使用特权

评论回复
7
ayb_ice| | 2011-9-20 21:12 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-20 21:14 编辑

直接上图,程序

/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////
#include "C8051F020.h"
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0CN    = 0x40;
    PCA0MD    = 0x08;
    PCA0CPM0  = 0x46;
    PCA0CPH0  = 0xDD;
}
void Port_IO_Init()
{
    // P0.0  -  CEX0 (PCA),  Push-Pull,  Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital
    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital
    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital
    // P2.4  -  Unassigned,  Open-Drain, Digital
    // P2.5  -  Unassigned,  Open-Drain, Digital
    // P2.6  -  Unassigned,  Open-Drain, Digital
    // P2.7  -  Unassigned,  Open-Drain, Digital
    // P3.0  -  Unassigned,  Open-Drain, Digital
    // P3.1  -  Unassigned,  Open-Drain, Digital
    // P3.2  -  Unassigned,  Open-Drain, Digital
    // P3.3  -  Unassigned,  Open-Drain, Digital
    // P3.4  -  Unassigned,  Open-Drain, Digital
    // P3.5  -  Unassigned,  Open-Drain, Digital
    // P3.6  -  Unassigned,  Open-Drain, Digital
    // P3.7  -  Unassigned,  Open-Drain, Digital
    P0MDOUT   = 0x01;
    XBR0      = 0x08;
    XBR2      = 0x40;
}
void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x0C;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    PCA_Init();
    Port_IO_Init();
    Oscillator_Init();
}



void main(void)
{
    Init_Device();

    while(1); // P0_0输出50KHZ信号
}

未命名.JPG (123.57 KB )

未命名.JPG

未命名1.JPG (113.71 KB )

未命名1.JPG

使用特权

评论回复
8
lyjian| | 2011-9-20 22:00 | 只看该作者
楼上看清楚楼主要什么再给程序

使用特权

评论回复
9
xjycug| | 2011-9-20 22:41 | 只看该作者
本帖最后由 xjycug 于 2011-9-20 22:44 编辑

PCA 频率输出方式可以输出频率不同的方波 ,
而 PCA的pwm模式,是可以输出占空比可变的,而频率固定的波形。
如果二者要兼顾,好像使用 PCA有些困难吧。
不使用PCA提供的模式,需要自己算。
使用两个内部定时器,一个控制IO输出的频率,另一个控制IO的翻转达到占空比的控制。应该比较好实现的。

使用特权

评论回复
10
ayb_ice| | 2011-9-21 11:32 | 只看该作者
对于C8051来说,PWM的频率只能是几种,通过改变输入时钟来实现,占空比没有问题
有些C8051的输入时钟可以是其它定时器的溢出,这样就可以改变频率了,或者接外部时钟实现

使用特权

评论回复
11
ayb_ice| | 2011-9-21 11:39 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-21 11:42 编辑

刚才看了一下020,PCA的时钟可以是T0的溢出,这样就可以控制PCA PWM的频率了,占空比就不说了,没有任何问题,只是是否能产生具体的50KHZ的频率就要计算了,要详细看手册了
可以的可能性很大
8位PWM方式,256级可调
50000*256=12800000=12.8M
你的输入时钟是20多M,远远大于12.8M
以上没有详细看手册,可能不准确

使用特权

评论回复
12
zhuyi2576|  楼主 | 2011-9-21 13:24 | 只看该作者
本帖最后由 zhuyi2576 于 2011-9-21 13:26 编辑
刚才看了一下020,PCA的时钟可以是T0的溢出,这样就可以控制PCA PWM的频率了,占空比就不说了,没有任何问题,只是是否能产生具体的50KHZ的频率就要计算了,要详细看手册了
可以的可能性很大
8位PWM方式,256级可调
...
ayb_ice 发表于 2011-9-21 11:39

20M是远大于12.8M,但我没办法准确到这个12.8M呀,要准确到这个时钟就必须要用定时器,这样又回到了我的问题所在了,1.7个周期就要中断一次,不要说做不准,程序还什么都干不了了

使用特权

评论回复
13
ayb_ice| | 2011-9-21 13:30 | 只看该作者

20M是远大于12.8M,但我没办法准确到这个12.8M呀,要准确到这个时钟就必须要用定时器,这样又回到了我的问题所在了,1.7个周期就要中断一次,不要说做不准,程序还什么都干不了了 ...
zhuyi2576 发表于 2011-9-21 13:24

谁告诉非要中断
又不看手册,就知道问

使用特权

评论回复
14
zhuyi2576|  楼主 | 2011-9-21 13:48 | 只看该作者
谁告诉非要中断
又不看手册,就知道问
ayb_ice 发表于 2011-9-21 13:30


我没打算用中断呀,数据自动重装。,初值2,每二个机器周期装一次值。会不会太频了,导致单片机做不了什么事

使用特权

评论回复
15
luckymoon| | 2011-9-21 14:18 | 只看该作者
其实很简单哥问题,既然选八位溢出,那选自动重装,因为是50K 20US中断一次,还有就是占空比可调,设置变量循环,当占空比变化时时间也跟着变化,这样你可以任意设置时间对应不同占空比。C8051系列频率选择你要具体设置寄存器参数,自己选择,多看资料,把他消化!

使用特权

评论回复
16
ayb_ice| | 2011-9-21 14:49 | 只看该作者
我没打算用中断呀,数据自动重装。,初值2,每二个机器周期装一次值。会不会太频了,导致单片机做不了什么事
zhuyi2576 发表于 2011-9-21 13:48

你能说出这样话,我只能无语了
既然自动重装,不使用中断,也就是无需软件干预,何来“导致单片机做不了什么事

”呢,我只能说你不想做事。

使用特权

评论回复
17
zhuyi2576|  楼主 | 2011-9-23 08:24 | 只看该作者
PCA 频率输出方式可以输出频率不同的方波 ,
而 PCA的pwm模式,是可以输出占空比可变的,而频率固定的波形。
如果二者要兼顾,好像使用 PCA有些困难吧。
不使用PCA提供的模式,需要自己算。
使用两个内部定时器,一 ...
xjycug 发表于 2011-9-20 22:41

要是用定时器,其实就是模拟了,用二个和用一个一样的呀,有必要分二个吗?

使用特权

评论回复
18
ayb_ice| | 2011-9-23 09:03 | 只看该作者
:L

使用特权

评论回复
19
受不了了| | 2011-9-23 10:54 | 只看该作者
C8051F已经够快了,更何况你还用的22兆晶振,50K对它来说小意思,用个定时器发生好了,用翻转,几乎不占什么资源,稍微有一丁点死区

使用特权

评论回复
20
gpzmvp| | 2013-10-17 11:41 | 只看该作者
mark哈哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

258

帖子

2

粉丝