leitang 发表于 2024-4-5 20:49:09

leitang 发表于 2024-4-5 20:47
大佬,我这个不是单纯的只要发10位pwm波,这个我已经验证过了,是完全可行的,我前面还有一个AD采样,我 ...

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

神农鼎 发表于 2024-4-5 21:08:29

等我同事上班后,请他们看下

leitang 发表于 2024-4-5 21:20:38

神农鼎 发表于 2024-4-5 21:08
等我同事上班后,请他们看下

好的,感谢大佬

leitang 发表于 2024-4-6 20:17:16

我好像知道我的问题了,应还是把 CCAPM2   &= 0x40;      //使能PCA模块2_PWM输出这句打开,但是我打开的波形就乱了,频率也不对,就像下面这张图所看到的

所以我这个到底是什么问题

电子DIY小家 发表于 2024-4-7 10:07:18

用这个测试



leitang 发表于 2024-4-7 10:51:18

电子DIY小家 发表于 2024-4-7 10:07
用这个测试

冲哥,你这个程序是好的,但是我加上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采样值打占空比
    }
}


电子DIY小家 发表于 2024-4-7 10:52:51

leitang 发表于 2024-4-7 10:51
冲哥,你这个程序是好的,但是我加上ad采样就不对了




P_SW2 &= 0x7f;这句去掉看看

leitang 发表于 2024-4-7 11:08:57

电子DIY小家 发表于 2024-4-7 10:52
P_SW2 &= 0x7f;这句去掉看看

试过,还是不太行,现在波形是这个


leitang 发表于 2024-4-7 11:12:58

leitang 发表于 2024-4-7 11:08
试过,还是不太行,现在波形是这个

按我现在的程序,应该是0v,出占空比0%

电子DIY小家 发表于 2024-4-7 11:43:19

串口打印一下val的数值,看下到底adc的问题还是pwm的问题
页: 1 [2] 3 4
查看完整版本: 8G系列的PCA/CCP/PWM, 10位PWM