这是PCA型PWM模式介绍,而你在1楼帖的代码是15位增强型PWM的设置。
增强型PWM通过PWMxxT1, PWMxxT2两个寄 ...
谢谢哥,我用的8位的pwm,另一个贴,已经有点点懂了
确实是您说的这样 angmall 发表于 2024-5-27 09:42
你是不是还用这个stc8g1k08a做实验?
stc8g1k08a是没有增强型PWM的。
对的,,我已经用的8位试了,可以
#include "intrins.h"
#include <STC8G.H>
void main()
{
// ... 其他端口初始化代码 ...
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
// PCA初始化
CCON=0x00; // 清除PCA控制寄存器
CMOD=0x08; // PCA计数模式配置(例如,定时器模式)
CL=0x00; // PCA计数器低位
CH=0x00; // PCA计数器高位
// 配置PCA通道1为PWM模式,并启用中断(如果需要)
CCAPM1=0x42; // 设置PCA通道1为PWM模式,并启用中断(如果需要)
PCA_PWM1=0x40; // 设置PCA通道1的PWM输出为高有效
// 设置PCA通道1的捕获/比较寄存器,用于定义PWM的占空比
// 这里需要根据实际情况调整CCAP1L和CCAP1H的值
CCAP1L=0xFF; // PCA通道1的捕获/比较值低位
CCAP1H=0x02; // PCA通道1的捕获/比较值高位
// 启动PCA
CR=1;
// ... 如果需要其他功能或配置,可以在这里添加 ...
while (1)
{
if(P32==0)
CCAP1H=0x29;
else
{
CCAP1H=0x02;
}
// 可以在这里添加PWM占空比或其他设置的动态更改
}
} zhange 发表于 2024-5-27 09:55
我刚学到stc32的pmw你这是stc哪个型号?
我这个不是用的增强型15位pwm,
我用的stc8g1k08a的 8位pwm
配置有点不一样,现在有点点懂了 给你个程序试试。
#include "intrins.h"
#include <STC8G.H>
#define pulse_width_MAX 0xfa // PWM脉宽最小值,占空比2.3%
#define pulse_width_MIN 0x05 // PWM脉宽最大值,占空比98%
#define STEP 0x02; // PWM脉宽变化步长
unsigned charpulse_width; // PWM脉宽变量,即存入CCAP0H中的值
//STC12、15、8、32都有库函数,一直就差89的延时函数。现在终于集齐了:lol
/*********************************************
程序名称 :延时函数
*********************************************/
//#define MAIN_Fosc 48000000L //定义主时钟
//#define MAIN_Fosc 44236800L //定义主时钟
//#define MAIN_Fosc 40000000L //定义主时钟
//#define MAIN_Fosc 36864000L //定义主时钟
//#define MAIN_Fosc 35000000L //定义主时钟
//#define MAIN_Fosc 33177600L //定义主时钟
//#define MAIN_Fosc 30000000L //定义主时钟
//#define MAIN_Fosc 27000000L //定义主时钟
#define MAIN_Fosc 24000000L //定义主时钟
//#define MAIN_Fosc 22118400L //定义主时钟
//#define MAIN_Fosc 20000000L //定义主时钟
//#define MAIN_Fosc 18432000L //定义主时钟
//#define MAIN_Fosc 12000000L //定义主时钟
//#define MAIN_Fosc 11059200L //定义主时钟
//#define MAIN_Fosc 6000000L //定义主时钟
//#define MAIN_Fosc 5529600L //定义主时钟
void Delay(unsigned int ms) //注:ms_max=65536
{
unsigned int i;
do
{
// i=MAIN_Fosc/96000L; //STC89/90_12T
// i=MAIN_Fosc/48000L; //STC89/90_6T
// i=MAIN_Fosc/14000; //STC12
// i=MAIN_Fosc/13000; //STC15
i=MAIN_Fosc/10000; //STC8
// i=MAIN_Fosc/6030; //STC32
while(--i) ;
}
while(--ms);
}
void PWM_OUT()
{
// 占空比从最大到最小
pulse_width=pulse_width_MIN;
while(1)
{
if (pulse_width>pulse_width_MAX) break;
CCAP0H= pulse_width;
CCAP1H= pulse_width;
CCAP2H= pulse_width;
pulse_width+=STEP;
Delay(20);
}
// 占空比从最小到最大
pulse_width=pulse_width_MAX;
while(1)
{
if(pulse_width<pulse_width_MIN) break;
CCAP0H= pulse_width;
CCAP1H= pulse_width;
CCAP2H= pulse_width;
pulse_width-=STEP;
Delay(20);
}
}
void main()
{
// ... 其他端口初始化代码 ...
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
// PCA初始化
CCON=0x00; // 清除PCA控制寄存器
CMOD=0x08; // PCA计数模式配置(例如,定时器模式)
CL=0x00; // PCA计数器低位
CH=0x00; // PCA计数器高位
//--6位PWM--
CCAPM0 = 0x42; //PCA模块0为PWM工作模式
PCA_PWM0 = 0x00; //PCA模块0输出6位PWM
CCAP0L = 0x00; //PWM占空比为50%[(40H-20H)/40H]
CCAP0H = 0x20;
// 配置PCA通道1为PWM模式,并启用中断(如果需要)
CCAPM1=0x42; // 设置PCA通道1为PWM模式,并启用中断(如果需要)
PCA_PWM1=0x00; // 设置PCA通道1的PWM输出为高有效
// 设置PCA通道1的捕获/比较寄存器,用于定义PWM的占空比
// 这里需要根据实际情况调整CCAP1L和CCAP1H的值
CCAP1L=0xFF; // PCA通道1的捕获/比较值低位
CCAP1H=0x02; // PCA通道1的捕获/比较值高位
CCAPM2 = 0x42; //PCA模块2为PWM工作模式
PCA_PWM2 = 0xc0; //PCA模块2输出10位PWM
CCAP2L = 0x00; //PWM占空比为96.875%[(400H-20H)/400H]
CCAP2H = 0x20;
// 启动PCA
CR=1;
// ... 如果需要其他功能或配置,可以在这里添加 ...
while (1)
{
// if(P32==0)
//
// CCAP1H=0x29;
// else
// {
// CCAP1H=0x02;
// }
PWM_OUT(); // 脉宽输出
// 可以在这里添加PWM占空比或其他设置的动态更改
}
}
angmall 发表于 2024-5-27 11:41
给你个程序试试。
哈哈,可以呼吸了。
正好我的是P33亮。
还有代码吗?
比如手电开关那种?
vb2002 发表于 2024-5-27 21:24
哈哈,可以呼吸了。
正好我的是P33亮。
还有代码吗?
有没有程序,我也想做一个手电筒,按键长按调整占空比 悠悠139 发表于 2024-6-24 22:32
有没有程序,我也想做一个手电筒,按键长按调整占空比
没有哦,我也在研究,小白一个.最近也没什么空,小孩眼睛近视了
页:
1
[2]