8G1K 10位PWM转DAC问题
本帖最后由 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的输出?
可以看一下STC8G部分的库函数:深圳国芯人工智能有限公司-库函数
独立例程里面有:
可以参考其12位PWM的实现方式
以下是测试正常的程序
判断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)位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_0==0x03ff) //如果pwm_0最大
temp_h|=0x02; //设置EPC0H(PCA_PWM0)为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)位置,赋值给temp_h
temp=PCA_PWM1&0xcd; //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_1==0x03ff) //如果pwm_1最大
temp_h|=0x02; //设置EPC1H(PCA_PWM1)为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)位置,赋值给temp_h
temp=PCA_PWM2&0xcd; //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_2==0x03ff) //如果pwm_2最大
temp_h|=0x02; //设置EPC2H(PCA_PWM2)为1
PCA_PWM2=temp_h; //写PCA_PWM2(先写高2位)
CCAP2H=temp_l; //写CCAP2H(再写低8位)
}
找到问题了,是IO口没有硬件上拉,软件配置成准双向口了,导致输出带不动,改为推挽输出后正常,感谢各位大佬指导
页:
[1]