找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2888|回复: 14
打印 上一主题 下一主题
收起左侧

这怎么改频率?单片机PCA模块输出PWM程序

[复制链接]
跳转到指定楼层
楼主
这怎么改频率 谢谢大家

#include "STC8.H"
#include <intrins.h>

#define u8  unsigned char
#define u16  unsigned int
#define u32  unsigned long


void PCA_PWM_Init()
{
                CCON = 0x00;  
                CMOD = 0x08; //PCA时钟为系统时钟  
                CL = 0x00;
          CH = 0x00;
                CCAPM0 = 0x42; //PCA模块0为PWM工作模式  1.7  0~63
                PCA_PWM0 = 0x80; //PCA模块0输出6位PWM  
                CCAP0L = 0x20; //PWM占空比为50%[(40H-20H)/40H]  
                CCAP0H = 0x20;  
          CCAPM1 = 0x42; //PCA模块1为PWM工作模式  
                PCA_PWM1 = 0x40; //PCA模块1输出7位PWM  
                CCAP1L = 0x20; //PWM占空比为75%[(80H-20H)/80H]  1.6        0~127
                CCAP1H = 0x20;
          CCAPM2 = 0x42; //PCA模块2为PWM工作模式  
                PCA_PWM2 = 0x00; //PCA模块2输出8位PWM  
                CCAP2L = 0x20; //PWM占空比为87.5%[(100H-20H)/100H]  1.5  0~255
                CCAP2H = 0x20;
          CCAPM3 = 0x42; //PCA模块3为PWM工作模式  
                PCA_PWM3 = 0xc0; //PCA模块3输出10位PWM
          CCAP3L = 0x20; //PWM占空比为96.875%[(400H-20H)/400H]  
                CCAP3H = 0x20;
           CR = 1; //启动PCA计时器   
}

//end
/******************************************************************************
* @ 函数名  : main
* @ 功  能  : 主函数
* @ 参  数  : 无
* @ 返回值  : 无
******************************************************************************/

int main()
{
    P0M1 = 0x20;   P0M0 = 0x00;   //设置为准双向口                        P0.5为高阻
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x20;   //设置为准双向口设置P3.5为推挽输出
    P3M1 = 0x40;   P3M0 = 0x00;   //设置为准双向口 P3.6为高阻
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x30;   P5M0 = 0x00;   //设置为准双向口  P5.5 P5.4为高阻
    P6M1 = 0x20;   P6M0 = 0x00;   //设置为准双向口  P6.5为高阻
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
        PCA_PWM_Init();                  
        while(1)
        {
         
        }
      
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

无效楼层,该帖已经被删除
板凳
ID:878061 发表于 2022-7-12 20:33 | 只看该作者
改变PCA时钟输入源的频率就可以改变PWM的频率
回复

使用道具 举报

地板
ID:1008383 发表于 2022-7-12 20:54 | 只看该作者
huashanhui20 发表于 2022-7-12 20:33
改变PCA时钟输入源的频率就可以改变PWM的频率

降了一些,但还是太大了
回复

使用道具 举报

5#
ID:401564 发表于 2022-7-12 21:58 | 只看该作者
CMOD   选择时钟为系统时钟/12
PCA_PWM0        选择10位PWM
还不行就用6MHZ的时钟
再不行就用32KHZ的时钟
回复

使用道具 举报

6#
ID:624769 发表于 2022-7-12 22:27 | 只看该作者
CMOD = 0x04;

然后,用定时器来定频率吧,你爱多慢就多慢。
回复

使用道具 举报

7#
ID:213173 发表于 2022-7-13 10:40 | 只看该作者
淡忘一世 发表于 2022-7-12 20:54
降了一些,但还是太大了

改变定时器时间就改变PWM频率,100Hz占空比50%示例
#include <STC8.H>

void Timer0Init(void)                //39微秒@12.000MHz
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0x2C;                //设置定时初始值
        TH0 = 0xFE;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

void main()
{
        CCON = 0x00;
        CMOD = 0x04;      //PWM周期=定时器0的溢出周期/256
        CL = 0x00;
        CH = 0x00;
        CCAPM0 = 0x42;    //PCA模块0为PWM工作模式
        PCA_PWM0 = 0x00;  //PCA模块0输出8位PWM
        CCAP0H=CCAP0L=0x80;//PWM占空比为50%
        CR = 1;           //启动PCA计时器
        Timer0Init();
        while (1);
}
回复

使用道具 举报

8#
ID:1008383 发表于 2022-7-13 10:54 | 只看该作者
Y_G_G 发表于 2022-7-12 21:58
CMOD   选择时钟为系统时钟/12
PCA_PWM0        选择10位PWM
还不行就用6MHZ的时钟

好的,试试
回复

使用道具 举报

9#
ID:1008383 发表于 2022-7-13 10:55 | 只看该作者
188610329 发表于 2022-7-12 22:27
CMOD = 0x04;

然后,用定时器来定频率吧,你爱多慢就多慢。

好的,谢谢
回复

使用道具 举报

10#
ID:1008383 发表于 2022-7-13 10:55 | 只看该作者
wulin 发表于 2022-7-13 10:40
改变定时器时间就改变PWM频率,100Hz占空比50%示例
#include

谢谢大佬
回复

使用道具 举报

11#
ID:213173 发表于 2022-7-13 11:17 | 只看该作者

//PWM周期=定时器0的溢出周期*256
回复

使用道具 举报

12#
ID:65237 发表于 2022-8-11 09:21 | 只看该作者
wulin 发表于 2022-7-13 11:17
//PWM周期=定时器0的溢出周期*256

//PWM周期=定时器0的溢出周期*256 ,如果溢出时间0.14US ,那14*256就它的周期吗?为什么是256 这个没搞明白,望指点小白 ,是因为8位机的原因吗
回复

使用道具 举报

13#
ID:161164 发表于 2022-8-11 10:46 | 只看该作者
阿飞7812 发表于 2022-8-11 09:21
//PWM周期=定时器0的溢出周期*256 ,如果溢出时间0.14US ,那14*256就它的周期吗?为什么是256 这个没搞明白 ...

STC8A-F手册有写


回复

使用道具 举报

14#
ID:65237 发表于 2022-8-12 09:14 | 只看该作者

谢谢指点 如果选6位PWM ,周期=就是如溢出时间*63 对吗
回复

使用道具 举报

15#
无效楼层,该帖已经被删除
16#
ID:1034262 发表于 2022-8-12 13:53 | 只看该作者
使用定时器0溢出率做PCA时钟。
回复

使用道具 举报

17#
ID:65237 发表于 2022-8-13 09:05 | 只看该作者
coody_sz 发表于 2022-8-12 13:53
使用定时器0溢出率做PCA时钟。

我的意思是怎样计算 如溢出为0.14US 6位PWM  频率是怎么计算的 是0.14*32  ,0010 0000,是这样的吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表