找回密码
 立即注册
楼主: lei***

STC8G系列的PCA/CCP/PWM, 10位PWM

[复制链接]
  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-5 20:49:09 | 显示全部楼层
    leitang 发表于 2024-4-5 20:47
    大佬,我这个不是单纯的只要发10位pwm波,这个我已经验证过了,是完全可行的,我前面还有一个AD采样,我 ...

    还有一点就是10位的重装值改写时必须要先关了pwm使能,然后写,再打开pwm使能,这样才能让其跟着采样值走

    点评

    我写个程序给你,等下。  详情 回复 发表于 2024-4-7 11:51
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9310

    回帖

    1万

    积分

    管理员

    积分
    13870
    发表于 2024-4-5 21:08:29 | 显示全部楼层
    等我同事上班后,请他们看下
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-5 21:20:38 | 显示全部楼层
    神农鼎 发表于 2024-4-5 21:08
    等我同事上班后,请他们看下

    好的,感谢大佬
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-6 20:17:16 | 显示全部楼层
    我好像知道我的问题了,应还是把 CCAPM2   &= 0x40;      //使能PCA模块2_PWM输出  这句打开,但是我打开的波形就乱了,频率也不对,就像下面这张图所看到的
    截图202404062016499560.jpg
    所以我这个到底是什么问题
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-4-7 10:07:18 | 显示全部楼层
    用这个测试

    STC8G_CCP输出PWM.rar (18.44 KB, 下载次数: 8)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-7 10:51:18 | 显示全部楼层

    冲哥,你这个程序是好的,但是我加上ad采样就不对了


    #include "stc8g.h"
    #include "intrins.h"

    //sfr     CCON    =   0xd8;
    //sbit    CF      =   CCON^7;
    //sbit    CR      =   CCON^6;
    //sbit    CCF2    =   CCON^2;
    //sbit    CCF1    =   CCON^1;
    //sbit    CCF0    =   CCON^0;
    //sfr     CMOD    =   0xd9;
    //sfr     CL      =   0xe9;
    //sfr     CH      =   0xf9;
    //sfr     CCAPM0  =   0xda;
    //sfr     CCAP0L  =   0xea;
    //sfr     CCAP0H  =   0xfa;
    //sfr     PCA_PWM0 =  0xf2;
    //sfr     CCAPM1  =   0xdb;
    //sfr     CCAP1L  =   0xeb;
    //sfr     CCAP1H  =   0xfb;
    //sfr     PCA_PWM1 =  0xf3;
    //sfr     CCAPM2  =   0xdc;
    //sfr     CCAP2L  =   0xec;
    //sfr     CCAP2H  =   0xfc;
    //sfr     PCA_PWM2 =  0xf4;

    //sfr     P0M1    =   0x93;
    //sfr     P0M0    =   0x94;
    //sfr     P1M1    =   0x91;
    //sfr     P1M0    =   0x92;
    //sfr     P2M1    =   0x95;
    //sfr     P2M0    =   0x96;
    //sfr     P3M1    =   0xb1;
    //sfr     P3M0    =   0xb2;
    //sfr     P4M1    =   0xb3;
    //sfr     P4M0    =   0xb4;
    //sfr     P5M1    =   0xc9;
    //sfr     P5M0    =   0xca;

    //sfr     P_SW1   =   0xa2;

    #define u16 unsigned int
    #define u8 unsigned char
    u16 val;   
    void Delay100ms()                //@11.0592MHz
    {
            unsigned char i, j, k;

            _nop_();
            i = 6;
            j = 157;
            k = 59;
            do
            {
                    do
                    {
                            while (--k);
                    } while (--j);
            } while (--i);
    }
    /*------------------------AD采样-----------------------------*/
    void Get_ADC(unsigned char channel)  //channel =2~3
    {
        P_SW2 |= 0x80;                              //使能访问XFR
        ADCTIM = 0x29;                              //设置ADC内部时序,达到该单片机的采样转换速率的极限500k
        P_SW2 &= 0x7f;
        ADCCFG = 0x20;                              //设置ADC时钟为内部时钟的1/2,转换右对齐

        ADC_CONTR = 0x80;                           //使能ADC模块

        ADC_RES = 0;
        ADC_RESL = 0;

        ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel;    //启动AD转换和adc通道选择

        _nop_();
        _nop_();
        _nop_();
        _nop_();

        while((ADC_CONTR & 0x20) == 0);   //wait for ADC finish
        ADC_CONTR &= ~0x20;     //清除ADC结束标志

    }

    void PWM_SET(u16 val)   //val 取值 0-1023
    {
        u8 dat = ((val>>8));

        PCA_PWM2 =  0xc0|(dat<<4);  
        CCAP2H = (u8)(val);

    }

    void main()
    {
    //    u16 PWM = 10;
        P3M0 &= ~0x0c; P3M1 |= 0x0c;    //IO口初始化
        P5M0 |= 0x30; P5M1 &= ~0x30;

        P_SW1 &= 0XCF;
        CCON = 0x00;
        CMOD = 0x08;                                //PCA时钟为系统时钟
        CL = 0x00;
        CH = 0x00;

    //--10位PWM--
        CCAPM2 = 0x42;                              //PCA模块2为PWM工作模式
        PCA_PWM2 = 0xc0;                            //PCA模块2输出10位PWM
       
    //    PWM_SET(PWM);

        CR = 1;                                     //启动PCA计时器

        while (1)
        {
           Get_ADC(0x02);                      //启动AD采样,打开采样通道2
                             val = ~(ADC_RES << 8| ADC_RESL);    //将AD采样的值付给a,并取反,使其占空比随着采样电压的增大而变大
                             PWM_SET(val);                 //跟随AD采样值打占空比
        }
    }


    点评

    P_SW2 &= 0x7f;这句去掉看看  详情 回复 发表于 2024-4-7 10:52
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-4-7 10:52:51 | 显示全部楼层
    leitang 发表于 2024-4-7 10:51
    冲哥,你这个程序是好的,但是我加上ad采样就不对了

    P_SW2 &= 0x7f;这句去掉看看
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-7 11:08:57 | 显示全部楼层
    电子DIY小家 发表于 2024-4-7 10:52
    P_SW2 &= 0x7f;这句去掉看看

    试过,还是不太行,现在波形是这个
    截图202404071108503136.jpg

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    6 小时前
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    1

    主题

    17

    回帖

    143

    积分

    注册会员

    积分
    143
     楼主| 发表于 2024-4-7 11:12:58 | 显示全部楼层
    leitang 发表于 2024-4-7 11:08
    试过,还是不太行,现在波形是这个

    按我现在的程序,应该是0v,出占空比0%
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 天前
  • 签到天数: 90 天

    [LV.6]常住居民II

    38

    主题

    986

    回帖

    6773

    积分

    荣誉版主

    冲哥视频教程和各种开源资料QQ交流群884047237,可群

    积分
    6773
    QQ
    发表于 2024-4-7 11:43:19 | 显示全部楼层
    串口打印一下val的数值,看下到底adc的问题还是pwm的问题
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-4 16:29 , Processed in 0.087320 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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