打印
[51单片机]

C8051F410产生8K PWM

[复制链接]
1823|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
w986366|  楼主 | 2015-9-15 21:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 w986366 于 2015-9-19 14:49 编辑

#include <c8051f410.h>               
                  
#define SYSCLK       24500000         
                        
void OSCILLATOR_Init (void);
void PORT_Init (void);
void PCA0_Init (void);

void main (void)
{

//   unsigned int delay_count;         // Used to implement a delay
   bit duty_direction = 0;             // 0 = Decrease; 1 = Increase

   PCA0MD = 0x00;                      // Disable watchdog timer

   PORT_Init ();                       // Initialize crossbar and GPIO
   OSCILLATOR_Init ();                 // Initialize oscillator
   PCA0_Init ();                       // Initialize PCA0

   while (1)
   {
   };
  
}


void OSCILLATOR_Init (void)
{
     OSCICN = 0x84;                    // 设置内部振荡器使能
                                       // SYSCLK为内部振荡器8分频。        3.0625MHZ
   CLKSEL = 0x00;                      // 选择内部晶振作为系统时钟
}

void PORT_Init (void)
{
   P0SKIP  = 0x07;
   XBR0    = 0x00;
   XBR1    = 0x41;                     // Route CEX0 to P0.3,
                                       // 使能交叉开关和弱上拉
                    
   P0MDOUT = 0x08;                     // 设置 CEX0 (P0.3)推挽输出
}                                                                        

void PCA0_Init (void)

{
   // 配置 PCA 时基; 禁用溢出中断
   PCA0CN = 0x00;                      // 停止计数; 清除标记
   PCA0MD = 0x08;                      // 用系统时钟作为时基

   PCA0CPM0 = 0x42;                    // 模块0 = 8-bit PWM模式

   // Configure initial PWM duty cycle = 50%
   PCA0CPH0 = 256 - (256 * 0.5);
   // Start PCA counter
   CR = 1;
   PCA0L = 0xaa;
   PCA0H = 0x99;
}





现在遇到的问题是 用系统时钟不能准确分频8K ,想用计时器但是不会配置!求计时器的配置

PS:由于硬件PWM 精度不够 现在用定时器完成PWM  频率依然是8K      每个周期的时间:1/8K    125us    高电平为3.90625us   也就是 1/36   
现在没定时器的时钟怎么设置没思路  能给点思路么?!



相关帖子

沙发
yhn1973| | 2015-9-16 09:11 | 只看该作者
系统时钟24.5M,PCA时钟为系统时钟12分频,8位PWM频率正好约等于8K

使用特权

评论回复
板凳
w986366|  楼主 | 2015-9-16 13:58 | 只看该作者
yhn1973 发表于 2015-9-16 09:11
系统时钟24.5M,PCA时钟为系统时钟12分频,8位PWM频率正好约等于8K

不能12分频已经解决了!用计时器

使用特权

评论回复
地板
w986366|  楼主 | 2015-9-16 13:59 | 只看该作者
void Timer_Init()
{
    TMOD   = 0x02;                                           //定时器方式
                                                                           //方式2:自动重装载的8位计数器/定时器

    CKCON  = 0x04;                                           //定时器1使用系统时钟
        ET0=0;                             // 不允许定时器0中断

    TH0    = (256-24.5/8000*256);
//        TL0    = (256-12);                                   //定时器0高字节
        TCON = 0x10;                       // 定时器0允许
}

使用特权

评论回复
5
yhn1973| | 2015-9-16 16:40 | 只看该作者
w986366 发表于 2015-9-16 13:58
不能12分频已经解决了!用计时器

怎么会不能12分频呢

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
w986366 + 1 我 用的内部晶振 看手册是不能12分频的!.
6
t446952352| | 2015-9-17 11:40 | 只看该作者
你试过,可以了吗

使用特权

评论回复
7
w986366|  楼主 | 2015-9-19 12:13 | 只看该作者
t446952352 发表于 2015-9-17 11:40
你试过,可以了吗

嗯 可以但是精度不够 我还要改成计时器来 输出 不能硬件PWM   1/8K  一个周期  125us    高电平为3.90625us   也就是 1/36                  现在没思路!  不知道计时器的时钟应该设置为多少!

使用特权

评论回复
8
yhn1973| | 2015-9-21 11:01 | 只看该作者
系统时钟可以选为内部时钟的1分频,而PCA的时基可以选为系统时钟的12分频(复位后默认就是),所以PCA的时基为24.5M/12=2.042M,8位PWM的频率为2.042M/256=7.975K

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝