找回密码
 立即注册
楼主: leitang

8G系列的PCA/CCP/PWM, 10位PWM

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

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

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

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

积分
52
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

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

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

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:164
  • 最近打卡:2025-01-04 18:47:02

3

主题

20

回帖

52

积分

注册会员

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

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

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

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:49 , Processed in 0.223418 second(s), 112 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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