用PCA输出PWM,timer0为时钟源,波形失真严重
这是波形,求解 把电容去了 leafstamen 发表于 2015-6-16 09:53把电容去了
木有加电容 有容性负载(这个基本是肯定的) 小李非刀 发表于 2015-6-16 11:29
有容性负载(这个基本是肯定的)
完全没有负载,这个是肯定的,我是断开负载,直接测的引脚
不过现在我测到供电电压低,才4.2几,等我提高供电电压再看 io设置对吗? qq8682 发表于 2015-6-16 12:25
io设置对吗?
推挽输出 你的失真也太厉害了,是不是哪里没弄好?这个和电压没有关系,就算是双向口输出波形也不会这么差.你把程序贴个上来看看{:lol:}
输出配置成推挽了吗? lyp103 发表于 2015-6-16 14:46
你的失真也太厉害了,是不是哪里没弄好?这个和电压没有关系,就算是双向口输出波形也不会这么差.你把程序贴个 ...
/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 PCA输出6/7/8位PWM举例-------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序 */
/*---------------------------------------------------------------------*/
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include <STC15F2K60S2.h>
#include "intrins.h"
#define FOSC 11059200L
typedef unsigned char BYTE;
typedef unsigned int WORD;
sbit LED = P1^7;
#define CCP_S0 0x10 //P_SW1.4
#define CCP_S1 0x20 //P_SW1.5
WORD temp = 0;
void Timer2Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xCD; //设置定时初值
T2H = 0xD4; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04;
EA =1;
}
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = (65536-FOSC/5000/265); //设置定时初值
TH0 = (65536-FOSC/5000/265)>>8; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void T0I(void) interrupt 12
{
temp++;
if(temp>800)
{
LED = ~LED;
temp = 0;
CCAP0H++;
if(CCAP0L>256)
{
CCAP0H = 0;
}
// CCAP0H = CCAP0L;
}
}
void main()
{
// ACC = P_SW1;
// ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=0
// P_SW1 = ACC;
P3M1 = 0x00;
P3M0 = 0xff; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
Timer2Init();
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=1 CCP_S1=0
ACC |= CCP_S0; //(P3.4/ECI_2, P3.5/CCP0_2, P3.6/CCP1_2, P3.7/CCP2_2)
P_SW1 = ACC;
//
//ACC = P_SW1;
//ACC &= ~(CCP_S0 | CCP_S1); //CCP_S0=0 CCP_S1=1
//ACC |= CCP_S1; //(P2.4/ECI_3, P2.5/CCP0_3, P2.6/CCP1_3, P2.7/CCP2_3)
//P_SW1 = ACC;
CCON = 0; //初始化PCA控制寄存器
//PCA定时器停止
//清除CF标志
//清除模块中断标志
CL = 0; //复位PCA寄存器
CH = 0;
CMOD = 0x04; //设置PCA时钟源
Timer0Init(); //禁止PCA定时器溢出中断
PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM
CCAP0H = 0x00; //PWM0的占空比为87.5% ((100H-20H)/100H)
CCAPM0 = 0x42; //PCA模块0为8位PWM模式
PCA_PWM1 = 0x40; //PCA模块1工作于7位PWM
CCAP1H = CCAP1L = 0xff; //PWM1的占空比为75% ((80H-20H)/80H)
CCAPM1 = 0x42; //PCA模块1为7位PWM模式
PCA_PWM2 = 0x80; //PCA模块2工作于6位PWM
CCAP2H = CCAP2L = 0x20; //PWM2的占空比为50% ((40H-20H)/40H)
CCAPM2 = 0x42; //PCA模块2为6位PWM模式
CR = 1; //PCA定时器开始工作
while (1);
}
这是照抄STC例程,自己又改了点 只有一个问题,LZ你示波器怎么接的?测量仪器也是负载... error_dan 发表于 2015-6-16 21:40
只有一个问题,LZ你示波器怎么接的?测量仪器也是负载...
就是夹子夹到单片机电源负极,探头触到输出引脚 if(CCAP0L>256) { CCAP0H = 0; } kinoko 发表于 2015-6-17 07:48
if(CCAP0L>256) { CCAP0H = 0; }
这块是有错误,但是不是造成失真的原因,CCAP0L是和CCAP0H相关联的,这么写是不对 你也可以试下那个时钟分频后直接IO输出,根本高低电平不对称,也就是占空比不为50%。 STC小问题还是挺多的。 STC的1T系列的IO输出信号边沿一般为10~20ns,如果输出太窄的脉冲,比如1us高,可能会稍小一点。 小李非刀 发表于 2015-6-19 14:17
STC的1T系列的IO输出信号边沿一般为10~20ns,如果输出太窄的脉冲,比如1us高,可能会稍小一点。 ...
图片上可以看到,频率不到5K 楼主示波器探头校准了么
页:
[1]