找回密码
 立即注册
查看: 372|回复: 3

8G1K 10位PWM转DAC问题

[复制链接]
已绑定手机

1

主题

3

回帖

15

积分

新手上路

积分
15
发表于 2024-11-26 09:39:54 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-11-26 09:48 编辑

使用8G1K17A-8PIN的PCA输出10位PWM,再转换成DAC输出,理论上应该是0-100占空比(数值0-1023)对应0-3.3V电压,实际上只有数值0-255有电压输出,其他值256-1023都是低电平,PWM初始化和占空比配置代码如下:
void PWM0Init(void)                //115200bps
{
    CCON = 0x00;        
    CMOD = 0x08;                //PCA时钟为系统时钟     
    CL = 0x00;          //
    CH = 0x00;


    CCAPM0 = 0x40;  
    PCA_PWM0 = 0xc0;        
    CCAP0L=0X00;            
    CCAP0H=0X00;            

    CCAPM0=0x42;
    CR = 1;
}
void PWM0_Set_Duty(short Duty)
{
        short dutytmp = Duty>>4;
        CCAPM0   = 0x40;         
        //PCA_PWM0 = 0xd4;
        PCA_PWM0&= ~(3<<4);
        PCA_PWM0&= ~(3<<2);  

        PCA_PWM0|= ((unsigned char)dutytmp)&0x30;

        PCA_PWM0|= ((unsigned char)dutytmp>>2)&0x0c;

        CCAP0H   = (unsigned char)Duty;     
        CCAP0L   = (unsigned char)Duty;         
        CCAPM0   = 0x42;   
        CR = 1;        
}

请问下,软件要怎样配置才能有0-3.3V的输出?

DAC波形.jpg
硬件电路.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5454

积分

版主

积分
5454
发表于 2024-11-26 09:53:55 | 显示全部楼层
可以看一下STC8G部分的库函数:深圳国芯人工智能有限公司-库函数

截图202411260953183679.jpg
独立例程里面有:
截图202411260953375201.jpg
可以参考其12位PWM的实现方式
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4849

回帖

8382

积分

超级版主

DebugLab

积分
8382
发表于 2024-11-26 09:58:03 | 显示全部楼层
以下是测试正常的程序
判断PWM值是否是最大,是为了解决最大值有一个周期死区,波形不是直线的问题
初始化:
        CCON=0x00;                                //设置PCA控制寄存器
        CMOD=0x80;                                //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
        CL=0x00;                                //设置PCA计数器
        CH=0x00;                                //设置PCA计数器
        CCAPM0=PWM0;                        //使能PCA模块0PWM功能
        PCA_PWM0=0xc0;                        //设置PCA模块0输出10位PWM
        CCAPM1=PWM1;                        //使能PCA模块1PWM功能
        PCA_PWM1=0xc0;                        //设置PCA模块1输出10位PWM
        CCAPM2=PWM2;                        //使能PCA模块2PWM功能
        PCA_PWM2=0xc0;                        //设置PCA模块2输出10位PWM
        CR=1;                                        //启动PCA
       
        EA=1;                                        //使能总中断


PCA:
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
        unsigned char temp_l,temp_h,temp;
       
        temp_l=pwm_0&0x00ff;                //读pwm_0低8位赋值给temp_l
        temp_h=(pwm_0&0x0300)>>4;        //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0[5:4])位置,赋值给temp_h
        temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0[5:4])、EPC0H(PCA_PWM0[1])清零后赋值给temp
        temp_h|=temp;                                //写其他位到temph
        if(pwm_0==0x03ff)                        //如果pwm_0最大
                temp_h|=0x02;                        //设置EPC0H(PCA_PWM0[1])为1
        PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
        CCAP0H=temp_l;                                //写CCAP0H(再写低8位)
       
        temp_l=pwm_1&0x00ff;                //读pwm_1低8位赋值给temp_l
        temp_h=(pwm_1&0x0300)>>4;        //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1[5:4])位置,赋值给temp_h
        temp=PCA_PWM1&0xcd;                        //读PCA_PWM1,XCCAP1H(PCA_PWM2[5:4])、EPC1H(PCA_PWM1[1])清零后赋值给temp
        temp_h|=temp;                                //写其他位到temph
        if(pwm_1==0x03ff)                        //如果pwm_1最大
                temp_h|=0x02;                        //设置EPC1H(PCA_PWM1[1])为1
        PCA_PWM1=temp_h;                        //写PCA_PWM1(先写高2位)
        CCAP1H=temp_l;                                //写CCAP1H(再写低8位)
       
        temp_l=pwm_2&0x00ff;                //读pwm_2低8位赋值给temp_l
        temp_h=(pwm_2&0x0300)>>4;        //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2[5:4])位置,赋值给temp_h
        temp=PCA_PWM2&0xcd;                        //读PCA_PWM2,XCCAP2H(PCA_PWM2[5:4])、EPC2H(PCA_PWM2[1])清零后赋值给temp
        temp_h|=temp;                                //写其他位到temph
        if(pwm_2==0x03ff)                        //如果pwm_2最大
                temp_h|=0x02;                        //设置EPC2H(PCA_PWM2[1])为1
        PCA_PWM2=temp_h;                        //写PCA_PWM2(先写高2位)
        CCAP2H=temp_l;                                //写CCAP2H(再写低8位)

}

DebugLab
回复 支持 反对

使用道具 举报 送花

已绑定手机

1

主题

3

回帖

15

积分

新手上路

积分
15
发表于 2024-11-26 11:48:55 | 显示全部楼层
找到问题了,是IO口没有硬件上拉,软件配置成准双向口了,导致输出带不动,改为推挽输出后正常,感谢各位大佬指导
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:40 , Processed in 0.121078 second(s), 67 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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