找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于STC8G单片机的PCA_10PWM输出注意事项

  [复制链接]
跳转到指定楼层
楼主


以前用过STC15W的8位PWM,配置很简单。
数据手册上也有参考代码。
一直渴望STC能出8个脚带AD的单片机,终于等到了,去年STC8G系列上市。这款芯片带10位ADC,6/7/8/10位硬件PWM等待。价格0.8元左右。
这几天公司接了个电位器调光的项目,这让我想到了STC8G1K08A单片机,自带的功能刚才满足产品要求。
说实在的,真心不敢用。毕竟是新品,也不知道质量咋样?抱着支持国产芯片的想法,决定试试。
说干就干,于是在某一个宝上买了几片。这个调光产品主要用到ADC和PWM。
测试ADC,没问题!
测试8位PWM,没问题!(以前玩过15系列的,代码基本相同)
想着有10位的PWM干嘛要用8位的呢?决定用10位的PWM.
结果搞了一天,愣是没搞出来。有波形输出,但是不是自己想要的波形。半夜了,睡觉吧!!!!!

这里说明下关于PWM寄存器:


10位PWM重装值和比较值的高2位和低8位在两个寄存器,PCA_PWMn和CCAPnH。
以前写代码习惯了根据数据手册的寄存器从上往下配置,特殊寄存器除外。
以前配置8位PWM初始化代码如下:
//8位PWM_PCA初始化
void PCA_Init()
{
        CCON=0x00;  //关闭PCA计数器,清除相关标志位
        CMOD=PCA_SYSCLK2;  //PCA时钟源为系统时钟2分频  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //计数器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0=0x42; //使能PCA模块0_PWM输出
        CCAP0L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP0H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM0=0x00;  //8位PWM输出        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1=0x42; //使能PCA模块0_PWM输出
        CCAP1L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP1H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM1=0x00; //8位PWM输出

        CCON|=  1<<6;   //启动计数器
}


这样,调节自己想要的占空比就OK了,8位PWM正常使用。所以,觉得修改PWM位数就行了。
于是,10位PWM配置如下:
//10位PWM_PCA初始化
//用电位器调节占空比
void PCA_Init()
{
        CCON=0x00;  //关闭PCA计数器,清除相关标志位
        CMOD=PCA_SYSCLK2;  //PCA时钟源为系统时钟2分频  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //计数器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0=0x42; //使能PCA模块0_PWM输出
        CCAP0L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP0H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM0=0xC0;  //10位PWM输出        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1=0x42; //使能PCA模块0_PWM输出
        CCAP1L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP1H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM1=0xC0; //10位PWM输出

        CCON|=  1<<6;   //启动计数器
}


调节占空比的时候用示波器观察波形,发现波形不对,波形的确是10位的,这点可以肯定。数据手册看了一遍又一遍,觉得代码没问题啊。
实在没办法了。后来添加了串口功能,决定把相关寄存器通过串口发出来看看。
通过观察发现,PWM重装值高2位永远是00,低8位没问题,调节占空比的代码如下:
//设置脉冲宽度
void PWM0_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重载值时,必须先写高两位 XCCAPnH[1:0],再写低 8 位 CCAPnH[7:0]。
        PCA_PWM0&= ~(3<<4);        //清零重装值高2位
        PCA_PWM0|= (Duty>>4)&0x30; //设置新的重装值高2位
        CCAP0H   = Duty;           //重装值低8位
}
这样写应该没错啊,咋回事呢?
于是在main函数里测试下:
void main()
{
        u8 st;
        
        P_SW2|=0x80; //可以访问扩展的RAM        
        UART1_Init();        
        ADC_Init();
        PCA_Init();
        Timer0_Init();
        SCH_Task_Init();
        
        st=SCH_Task_Add(PWM_Out,30,30,0,ENABLE);        
        Timer0_Cmd(ENABLE);
        
        PCA_PWM0=0xFF;
        UART1_SendByte(PCA_PWM0);
        while(1)
        {
                SCH_Task_Dispatch();
        }
}


结果发现,串口发出来的是0xCF。明明赋值0xFF,为啥读出来的却是0xCF呢?明摆着那两个位没写进去。奇怪了!!!
于是我把//PCA_Init();初始化函数注释掉.再来测试下,给PCA_PWM0寄存器赋值0xFF,读出来是0xFF。可以写进去了。
这就证明问题出在PCA_Init();初始化函数。回头看看初始化函数.....................省略繁琐的过程............................!
最后发现是CCAPM0寄存器的问题,这个寄存器我用到了,允许比较功能和使能PWM 输出。
问题就出在使能PWM输出这个位上。使能了PWM输出,Pwm重装值高2位就写不进去,也就没办法调节占空比。


这和资料上的最后一句话是不是冲突了。这算不算一个BUG呢。
在修改重装值前,先禁止PWM 输出,修改好后再打开。这能算无干扰吗???


最后代码修改如下:
//10位PWMPCA初始化
void PCA_Init()
{
        CCON=0x00;  //关闭PCA计数器,清除相关标志位
        CMOD=PCA_SYSCLK2;  //PCA时钟源为系统时钟2分频  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //计数器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0 = 0x40;  //失能PCA模块0_PWM输出
        CCAP0L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP0H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM0=0xC0;  //10位PWM输出
        CCAPM0=0x42; //使能PCA模块0_PWM输出
        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1 = 0x40;  //失能PCA模块1_PWM输出
        CCAP1L=0X00;    //捕获比较寄存器低8位,比较值
        CCAP1H=0X00;    //捕获比较寄存器高8位,重装值
        PCA_PWM1=0xC0; //10位PWM输出
        CCAPM1=0x42; //使能PCA模块0_PWM输出
        
        CCON|=  1<<6;   //启动计数器
}


//设置脉冲宽度
void PWM0_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重载值时,必须先写高两位 XCCAPnH[1:0],再写低 8 位 CCAPnH[7:0]。
        
        CCAPM0   = 0x40;           //失能PCA模块0_PWM输出
        PCA_PWM0&= ~(3<<4);        //清零重装值高2位
        PCA_PWM0|= (Duty>>4)&0x30; //设置新的重装值高2位
        CCAP0H   = Duty;           //重装值低8位
        CCAPM0   = 0x42;           //使能PCA模块0_PWM输出
}


//设置脉冲宽度
void PWM1_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重载值时,必须先写高两位 XCCAPnH[1:0],再写低 8 位 CCAPnH[7:0]。
        
        CCAPM1   = 0x40;           //失能PCA模块1_PWM输出
        PCA_PWM1&= ~(3<<4);        //清零重装值高2位
        PCA_PWM1|= (Duty>>4)&0x30; //设置新的重装值高2位
        CCAP1H   = Duty;           //重装值低8位
        CCAPM1   = 0x42;           //使能PCA模块0_PWM输出
}


以上是个人见解,如有说错的,请大家指出,我会虚心求教!!
















评分

参与人数 4黑币 +130 收起 理由
wpppmlah + 15 赞一个!
MOVEORDIE + 10 感谢分享
丝瓜 + 5 感谢踩坑!
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏27 分享淘帖 顶7 踩
回复

使用道具 举报

沙发
ID:359272 发表于 2021-5-18 17:16 | 只看该作者
非常感谢楼主的调试过程分享,正准备上手研究下。
回复

使用道具 举报

板凳
ID:807182 发表于 2021-5-24 16:41 | 只看该作者
大佬,我想请教一下,我直接用这个给的官方例程移植过来,PWM就是没有输出?可以帮忙看一下吗?
回复

使用道具 举报

地板
ID:554500 发表于 2021-5-24 21:08 | 只看该作者
暖西夏 发表于 2021-5-24 16:41
大佬,我想请教一下,我直接用这个给的官方例程移植过来,PWM就是没有输出?可以帮忙看一下吗?

代码贴出来大家一起讨论,共师兄习!!!
回复

使用道具 举报

5#
ID:884843 发表于 2021-5-25 12:17 | 只看该作者
感谢分享调试心得
回复

使用道具 举报

6#
ID:390307 发表于 2021-5-26 23:57 | 只看该作者
昨天正好也发现这个问题,感谢楼主踩坑分享
回复

使用道具 举报

7#
ID:332838 发表于 2021-6-17 16:41 | 只看该作者
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
请问一下,这里为什么要除以1024?
回复

使用道具 举报

8#
ID:554500 发表于 2021-6-18 09:25 | 只看该作者
yonnhor 发表于 2021-6-17 16:41
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
请问一下,这里为什么要除以1024?

因为PWM是10位的
回复

使用道具 举报

9#
ID:272119 发表于 2021-6-18 14:38 | 只看该作者
STC8G1K08A 现在某一个宝行价5元以上吧,真心无法理解,1元不到的报价现在都5元过头,还怎么搞小项目开发STC怎么用国产占领市场......
回复

使用道具 举报

10#
ID:554500 发表于 2021-6-18 15:06 | 只看该作者
qq603599910 发表于 2021-6-18 14:38
STC8G1K08A 现在某一个宝行价5元以上吧,真心无法理解,1元不到的报价现在都5元过头,还怎么搞小项目开发STC怎 ...

关键是有价无市,根本拿不到货。
去年stc8h1k17 ssop20 含税价1.35元
上个月从stc代理那里拿货,单价6元,拿了3万个,花了我18万。
心在滴血啊。没办法,产品还得做。少赚点就少赚点。
回复

使用道具 举报

11#
ID:155507 发表于 2021-6-26 12:24 | 只看该作者
18701931930 发表于 2021-6-18 15:06
关键是有价无市,根本拿不到货。
去年stc8h1k17 ssop20 含税价1.35元
上个月从stc代理那里拿货,单价6 ...

某一个宝上的价格高一点,自己玩玩研究无所谓,量大还是要联系原厂订购。
回复

使用道具 举报

12#
ID:927469 发表于 2021-6-29 23:04 | 只看该作者
楼主这个电路图能看看吗
回复

使用道具 举报

13#
ID:554500 发表于 2021-6-30 08:36 | 只看该作者
kmikmi 发表于 2021-6-29 23:04
楼主这个电路图能看看吗


单片机:STC8G1K08A
PWM输出连接 P3.2-P3.3
回复

使用道具 举报

14#
ID:893179 发表于 2021-7-10 18:25 | 只看该作者
“//用电位器调节占空比”    ————    怎么用电位器调节占空比了?
回复

使用道具 举报

15#
ID:554500 发表于 2021-7-11 16:08 | 只看该作者
420793043 发表于 2021-7-10 18:25
“//用电位器调节占空比”    ————    怎么用电位器调节占空比了?

电位器调节就用AD转换,模拟量对应想要的占空比
回复

使用道具 举报

16#
ID:120977 发表于 2021-8-6 10:47 来自手机 | 只看该作者
PCA_PWM1= 0xc0|((Duty>>4)&0x30); //设置新的重装值高2位         CCAP1H   = Duty;           //重装值低8位
回复

使用道具 举报

17#
ID:584195 发表于 2021-8-6 19:50 | 只看该作者
18701931930 发表于 2021-6-18 15:06
关键是有价无市,根本拿不到货。
去年stc8h1k17 ssop20 含税价1.35元
上个月从stc代理那里拿货,单价6 ...

有钱人呀
招不招人!
回复

使用道具 举报

18#
ID:518902 发表于 2021-11-21 22:25 | 只看该作者
好帖,喜欢~
回复

使用道具 举报

19#
ID:907700 发表于 2021-12-15 14:32 | 只看该作者
怪不得我的也不正常,谢谢了
回复

使用道具 举报

20#
ID:877543 发表于 2021-12-17 15:45 | 只看该作者
谢谢楼主,仿真成功了,中文注释也很详细
回复

使用道具 举报

21#
ID:140644 发表于 2022-2-5 12:33 | 只看该作者
还没有试过
回复

使用道具 举报

22#
ID:514317 发表于 2022-2-7 16:38 | 只看该作者
STC8系列的PWM比老版本强   也多了很多寄存器   不看手册上的例程还真不一定能调通   用什么特殊功能之前还是需要看下例程的   
回复

使用道具 举报

23#
ID:879902 发表于 2022-4-19 11:22 | 只看该作者
我也是这个片子 PWM占空比修改遇到了问题
回复

使用道具 举报

24#
ID:961114 发表于 2022-4-19 14:01 | 只看该作者
回复

使用道具 举报

25#
ID:349729 发表于 2022-10-11 11:02 | 只看该作者

怪不得我的也不正常,谢谢了
回复

使用道具 举报

26#
ID:824308 发表于 2022-10-16 14:49 | 只看该作者
注释很详细, 感谢分享
回复

使用道具 举报

27#
ID:950218 发表于 2022-10-18 09:30 | 只看该作者
楼主你好!请问使用脚1(P5.4)输出PWM可以的吗?可以的话,有什么需要注意的吗?
回复

使用道具 举报

28#
ID:652434 发表于 2022-11-6 15:32 | 只看该作者
感谢楼主分享详细调试过程,我学习了
回复

使用道具 举报

29#
ID:1067572 发表于 2023-3-21 11:36 | 只看该作者
有没有试过 CCAPM1   = 0xC2;           //使能PCA模块0_PWM输出  不是0X42
回复

使用道具 举报

30#
ID:64089 发表于 2023-4-24 17:00 | 只看该作者
感谢楼主分享。刚好也在玩PWM,同样10位的PWM参数写超过FF就没有输出了,刚好翻到你的帖子,帮我解决了一个很大的问题,实测楼主的程序是可以用的,再次感谢!
回复

使用道具 举报

31#
ID:364201 发表于 2023-6-15 10:08 | 只看该作者
请教一下,如何控制同一个PCA模块让引脚输出不同占空比
回复

使用道具 举报

32#
ID:364201 发表于 2023-6-18 16:03 | 只看该作者
nsj21n 发表于 2023-4-24 17:00
感谢楼主分享。刚好也在玩PWM,同样10位的PWM参数写超过FF就没有输出了,刚好翻到你的帖子,帮我解决了一个 ...

高位是空的,不需要赋值吧!
回复

使用道具 举报

33#
ID:464755 发表于 2023-9-9 06:41 来自手机 | 只看该作者
正好用到,PCA准备做Da输出。
回复

使用道具 举报

34#
ID:1093740 发表于 2023-10-27 15:11 | 只看该作者
这两个控制寄存器有影响么?没看懂啊, 为啥关一下,才能写,不关不让写呢
回复

使用道具 举报

35#
ID:1115376 发表于 2024-4-4 15:22 | 只看该作者
大佬,我这个十位pwm电位器调节为何出这种波形
回复

使用道具 举报

36#
ID:1109793 发表于 2024-4-6 09:33 | 只看该作者
请问10位的PWM频率能到多少?
回复

使用道具 举报

37#
ID:961114 发表于 2024-4-7 14:39 | 只看该作者
xiaobendan001 发表于 2024-4-6 09:33
请问10位的PWM频率能到多少?

STC32G12K128, PWM的时钟源可以 144MHz/146MHz
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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