求助,stc12c5a60s2产生pwm用示波器没有波形输出
/*********************************************************************************************
两路PWM输出控制设置
/*********************************************************************************************/
#ifndef __SET_PWM_H__
#define __SET_PWM_H__
//***********************************************************************************/
//PWM模式设置
void Init_PWM()
{
// set PWM mode
CCON = 0; //Initial PCA control register(PCA timer stop,Clear CF flag,Clear all module interrupt flag)
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x04; //Set PCA timer clock source as timer0 overflow,Disable PCA timer overflow interrupt
CCAP0H = CCAP0L =0x80; //PWM0 port output X% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 0x80; //PWM1 port output X% duty cycle square wave
CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1; //PCA timer start run
}
//***********************************************************************************/
//设置Timer0为8位自动重载模式,作为PWM时钟源
void Init_Timer0()
{
AUXR = 0x00; //timer0 work in 12T mode
TMOD|= 0x02; //set timer0 counter mode2 (8-bit auto-reload)
TH0=TL0=130; //PWM 50Hz
TR0 = 1; //timer0 start running(as PWM clk)
}
#endif 头文件是直接用的stc12c5a60s2.h文件,就是没有波形输出,检查过很多次 寄存器配置也没发现问题,求大神帮忙看下
这个是我自己用的,你可以参考一下。你直接对CCAPXH和CCAPXL赋值,就可以直接在P12,P13,P14,P15产生PWM波了。
#include<STC12C5A60S2.H>
#include "pca.h"
void PWM_init (void)
{
CCON=0;
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP0H=0x00; // PWM0初始时为0
CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式(使用时删除//)
CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
CCAP1H=0x00; // PWM1初始时为0
CR=1; //启动PCA定时器
}
void PWM0_set (unsigned char a) //左轮
{
CCAP0L= a; //设置值直接写入CCAP0L
CCAP0H= a; //设置值直接写入CCAP0H
}
void PWM1_set (unsigned char a) //右轮
{
CCAP1L= a; //设置值直接写入CCAP1L
CCAP1H= a; //设置值直接写入CCAP1H
}
芯片是正常供电的啊,也换过一个一样的芯片去试,但也一样,示波器没有波形
检查下单片机是否正常工作?
嗯嗯,谢啦,参考下
#include"stc12c5a60s2.h"
void main()
{
CCAPM0=0x42;//8位PWM模式
CCON=0x40; //启动PWM计数
CMOD=0x04;//设置PWM时钟使用定时器0
TMOD=0x02;//定时器0工作方式2
TH0 =0;
TL0 =178;//定时78us * 256=20ms
TR0 =1;//启动定时器
CCAP0H=CCAP0L=230;//占空比调整至10%
}
我昨天实验的,有波形50hz。工作方式也和你的类似,据说TH0只能为0,TL0自己工作,我试了下,TH0赋值后,波形频率不对。而且我给TLO赋其他值,波形都不产生了,我现在还不知道怎么回事呢,你知道为啥不,讨论讨论。
#include"stc12c5a60s2.h"
void main()
{
CCAPM0=0x42;//8位PWM模式
CCON=0x40; //启动PWM计数
CMOD=0x04;//设置PWM时钟使用定时器0
TMOD=0x02;//定时器0工作方式2
TH0 =178;
TL0 =178;//定时78us * 256=20ms
TR0 =1;//启动定时器
while(1)
{
CCAP0H=CCAP0L=230;//占空比调整至10%
}
}
我的问题解决了,这个频率可调,TH0,TL0都需要赋值。之前那个程序不成,可能是没加while (1),自身循环运行了,导致定时不准。
定时器的话TH0和TL0肯定都要重装初值啊。
恩恩,我发的第二个调整了,你产生的波形怎么样,我的波形显示单位为0.5mv的时候,上升沿有些抖动,是程序问题么,你的波形整齐么。
嗯嗯,还可以。要记得在主程序加while(1);
输出PWM后怎么在程序中调节占空比?例如中断中怎么赋值能改变输出PWM的占空比?
感谢啊!我也是这样写程序的,想用来驱动蜂鸣器