61
818
1502
金牌会员
使用道具 举报 送花
130
1522
1871
乘风*** 发表于 2024-5-27 09:21 这是PCA型PWM模式介绍,而你在1楼帖的代码是15位增强型PWM的设置。 增强型PWM通过PWMxxT1, PWMxxT2两个寄 ...
angm*** 发表于 2024-5-27 09:42 你是不是还用这个stc8g1k08a做实验? stc8g1k08a是没有增强型PWM的。
#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占空比或其他设置的动态更改 } }复制代码
zha*** 发表于 2024-5-27 09:55 我刚学到stc32的pmw 你这是stc哪个型号?
10
1161
5133
论坛元老
#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 char pulse_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占空比或其他设置的动态更改 } } 复制代码
angm*** 发表于 2024-5-27 11:41 给你个程序试试。
0
2
26
新手上路
vb2*** 发表于 2024-5-27 21:24 哈哈,可以呼吸了。 正好我的是P33亮。 还有代码吗?
悠悠*** 发表于 2024-6-24 22:32 有没有程序,我也想做一个手电筒,按键长按调整占空比
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-4 10:00 , Processed in 0.126203 second(s), 101 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.