leitang
发表于 2024-4-5 20:49:09
leitang 发表于 2024-4-5 20:47
大佬,我这个不是单纯的只要发10位pwm波,这个我已经验证过了,是完全可行的,我前面还有一个AD采样,我 ...
还有一点就是10位的重装值改写时必须要先关了pwm使能,然后写,再打开pwm使能,这样才能让其跟着采样值走
神农鼎
发表于 2024-4-5 21:08:29
等我同事上班后,请他们看下
leitang
发表于 2024-4-5 21:20:38
神农鼎 发表于 2024-4-5 21:08
等我同事上班后,请他们看下
好的,感谢大佬
leitang
发表于 2024-4-6 20:17:16
我好像知道我的问题了,应还是把 CCAPM2 &= 0x40; //使能PCA模块2_PWM输出这句打开,但是我打开的波形就乱了,频率也不对,就像下面这张图所看到的
所以我这个到底是什么问题
电子DIY小家
发表于 2024-4-7 10:07:18
用这个测试
leitang
发表于 2024-4-7 10:51:18
电子DIY小家 发表于 2024-4-7 10:07
用这个测试
冲哥,你这个程序是好的,但是我加上ad采样就不对了
#include "stc8g.h"
#include "intrins.h"
//sfr CCON = 0xd8;
//sbit CF = CCON^7;
//sbit CR = CCON^6;
//sbit CCF2 = CCON^2;
//sbit CCF1 = CCON^1;
//sbit CCF0 = CCON^0;
//sfr CMOD = 0xd9;
//sfr CL = 0xe9;
//sfr CH = 0xf9;
//sfr CCAPM0= 0xda;
//sfr CCAP0L= 0xea;
//sfr CCAP0H= 0xfa;
//sfr PCA_PWM0 =0xf2;
//sfr CCAPM1= 0xdb;
//sfr CCAP1L= 0xeb;
//sfr CCAP1H= 0xfb;
//sfr PCA_PWM1 =0xf3;
//sfr CCAPM2= 0xdc;
//sfr CCAP2L= 0xec;
//sfr CCAP2H= 0xfc;
//sfr PCA_PWM2 =0xf4;
//sfr P0M1 = 0x93;
//sfr P0M0 = 0x94;
//sfr P1M1 = 0x91;
//sfr P1M0 = 0x92;
//sfr P2M1 = 0x95;
//sfr P2M0 = 0x96;
//sfr P3M1 = 0xb1;
//sfr P3M0 = 0xb2;
//sfr P4M1 = 0xb3;
//sfr P4M0 = 0xb4;
//sfr P5M1 = 0xc9;
//sfr P5M0 = 0xca;
//sfr P_SW1 = 0xa2;
#define u16 unsigned int
#define u8 unsigned char
u16 val;
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 6;
j = 157;
k = 59;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*------------------------AD采样-----------------------------*/
void Get_ADC(unsigned char channel)//channel =2~3
{
P_SW2 |= 0x80; //使能访问XFR
ADCTIM = 0x29; //设置ADC内部时序,达到该单片机的采样转换速率的极限500k
P_SW2 &= 0x7f;
ADCCFG = 0x20; //设置ADC时钟为内部时钟的1/2,转换右对齐
ADC_CONTR = 0x80; //使能ADC模块
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xF0) | 0x40 | channel; //启动AD转换和adc通道选择
_nop_();
_nop_();
_nop_();
_nop_();
while((ADC_CONTR & 0x20) == 0); //wait for ADC finish
ADC_CONTR &= ~0x20; //清除ADC结束标志
}
void PWM_SET(u16 val) //val 取值 0-1023
{
u8 dat = ((val>>8));
PCA_PWM2 =0xc0|(dat<<4);
CCAP2H = (u8)(val);
}
void main()
{
// u16 PWM = 10;
P3M0 &= ~0x0c; P3M1 |= 0x0c; //IO口初始化
P5M0 |= 0x30; P5M1 &= ~0x30;
P_SW1 &= 0XCF;
CCON = 0x00;
CMOD = 0x08; //PCA时钟为系统时钟
CL = 0x00;
CH = 0x00;
//--10位PWM--
CCAPM2 = 0x42; //PCA模块2为PWM工作模式
PCA_PWM2 = 0xc0; //PCA模块2输出10位PWM
// PWM_SET(PWM);
CR = 1; //启动PCA计时器
while (1)
{
Get_ADC(0x02); //启动AD采样,打开采样通道2
val = ~(ADC_RES << 8| ADC_RESL); //将AD采样的值付给a,并取反,使其占空比随着采样电压的增大而变大
PWM_SET(val); //跟随AD采样值打占空比
}
}
电子DIY小家
发表于 2024-4-7 10:52:51
leitang 发表于 2024-4-7 10:51
冲哥,你这个程序是好的,但是我加上ad采样就不对了
P_SW2 &= 0x7f;这句去掉看看
leitang
发表于 2024-4-7 11:08:57
电子DIY小家 发表于 2024-4-7 10:52
P_SW2 &= 0x7f;这句去掉看看
试过,还是不太行,现在波形是这个
leitang
发表于 2024-4-7 11:12:58
leitang 发表于 2024-4-7 11:08
试过,还是不太行,现在波形是这个
按我现在的程序,应该是0v,出占空比0%
电子DIY小家
发表于 2024-4-7 11:43:19
串口打印一下val的数值,看下到底adc的问题还是pwm的问题