STC12H1K16PWM 没输出输出的问题 | 梁工给了正确的程序
代码如下,我的P3.5脚 没PWM输出的,好奇怪。不知道是那里没设置对,来个大神指导下啊。芯片用的是STC12H1K16,内部晶振11.0592MHz.
芯片电路没有外接任何元器件,只测芯片脚位的信号。
void pwm_init()
{
CCON = 0x00; //
CL = 0; //PCA计数器 低8位
CH = 0; //PCA计数器 高8位
CMOD = 0x00; //选择时钟源为系统时钟源的1/12
CCAPM0 = 0x42; //0100 0010允许比较器,允许PWM0引脚输出
//PCA_PWM0=0x00; //8位PWM
PCA_PWM0=0x40; //7位PWM
CCAP0H = CCAP0L = 0x00; //设置占空比为 0
PWMA_PS = 0xff;
PWMB_PS = 0xf3;//P3.5输出PWM
CR = 1; //启动 PCA 计数器阵列
}
main()
{
uchar key1up=0,key2up=0,gear1=0,gear2=0;
P1M0=0x00;//设置P1为准双向口
P1M1=0x00;
P3M0=0x00;//设置P3为准双向口
P3M1=0x00;
P1=0xff;
P3=0xff;
pwm_init();
//PCA_PWM0=0x02;CCAP0H= CCAP0L=0xFF; //固定输出低
//PCA_PWM0=0x00;CCAP0H= CCAP0L=0x00; //固定输出高
CR = 0;
CCAP0L=0x20;//PWM占空比(80H-20H)/80H(75%)//7位PWM
CCAP0H=0x20;
CR = 1;
P34=0;
while(1)
{
delay(4000);
P34 = ~P34;
}
} 你这里配置的PCA0 为什么最后配置PWM输出...
寄存器用混了吧 不是用PCA比较器的吗?我看文档上的例程是这样的。
没错啊,,但是你用的是PCA的PCA0啊 你测不是PCA1么 不是啊,我一直用的是PCA0啊,只不过是输出是从P3.5口输出啊,难道从P3.5口输出要设成PCA1的? ......不是兄弟你看手册了么?
我这溜了一遍手册也没见这个片子的PCA切换引脚的寄存器啊... chenczy 发表于 2024-7-4 15:34
不是啊,我一直用的是PCA0啊,只不过是输出是从P3.5口输出啊,难道从P3.5口输出要设成PCA1的? ...
你的程序有问题,P3.5是PCA1,并且还操作无关的 PWMA_PS、 PWMB_PS。
我写了测试程序给你:
/************* 功能说明 **************
请先别修改程序, 直接下载"01-PCA-4路PWM-C语言"里的"PCA.hex"测试.
4路PCA都配置成10位PWM的应用.
本例 PWM0(CCP0)-->P3.7, PWM1(CCP1)-->P3.5, PWM2(CCP2)-->P2.0, PWM3(CCP3)-->P2.4, 用户可以自行修改切换到其它端口.
PWM0、PWM1、PWM2输出呼吸灯效果,PWM3间歇输出。
******************************************/
本帖最后由 chenczy 于 2024-7-6 09:25 编辑
梁工 发表于 2024-7-4 15:43
你的程序有问题,P3.5是PCA1,并且还操作无关的 PWMA_PS、 PWMB_PS。
我写了测试程序给你:
我下了你的程序,自己也编了,下到芯片是可以的,但是我把你的代码移到我的项目里,下到芯片就不行,搞不懂。
这是你的程序
/******************** 主函数 **************************/
void main(void)
{
PCA_config(4, 3); //clk=4: 选择时钟1T, 3: 10位PWM
P3n_push_pull(Pin7+Pin5); // P3.7 P3.5设置为推挽输出
P2n_push_pull(Pin4+Pin0); // P2.4 P2.0设置为推挽输出
pwm = 128;
B_PWM_Dir = 0;
UpdatePwm(PCA0,768); //输出占空比3/4的PWM, 时间为2ms.
while (1)
{
;//delay_ms(2);
/*
if(B_PWM_Dir)
{
if(--pwm <= 8) B_PWM_Dir = 0;
}
else
{
if(++pwm >= 1016) B_PWM_Dir = 1;
}
UpdatePwm(PCA0, pwm); //更新PWM.
UpdatePwm(PCA1, pwm); //更新PWM.
UpdatePwm(PCA2, pwm); //更新PWM.
if(++cnt >= 4) //8ms一个周期, 演示如何关闭 开启PWM.
{
cnt = 0;
UpdatePwm(PCA3, 256); //输出占空比1/4的PWM, 时间为2ms.
}
else if(cnt == 1) PwmOutContinue(PCA3, 0); //连续输出低电平0, 时间为2ms.
else if(cnt == 2) UpdatePwm(PCA3,768); //输出占空比3/4的PWM, 时间为2ms.
else if(cnt == 3) PwmOutContinue(PCA3, 1); //连续输出高电平1, 时间为2ms.
*/
}
}
这是我的程序
void main(void)
{
uchar key1up=0,key2up=0,gear1=0,gear2=0;
PCA_config(4, 3);
P3n_push_pull(Pin7+Pin5); // P3.7 P3.5设置为推挽输出
P34=0;
//UpdatePwm(0,768); //输出占空比3/4的PWM.
PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((768 >> 4) & 0x30);
CCAP0H = 768;
while(1)
{
delay(2000);
P34 = ~P34;
}
chenczy 发表于 2024-7-6 09:22
我下了你的程序,自己也编了,下到芯片是可以的,但是我把你的代码移到我的项目里,下到芯片就不行,搞不 ...
你应该先使用UpdatePwm(0,768);试试。你改到出现错误了。 嗯,问题找到了 PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((768 >> 4) & 0x30);这时的设置的数据有问题,按你的这个设就好了
页:
[1]