STC15W4K48S4 的 PCA_PWM 只有两路 PWM0 和 PWM1 已经用来控制了两个风机,因为项目需要要控制3个风机所以又添加了一个PWM来控制风机,查看电路板发现只有一个 PWM7的引脚是空起来的,所以就用这个引脚进行第3路的PWM输出,
程序如下:红色部分是添加的 PWM7的程序,其他是STC芯片资料里的程序
void PWM7_Init(void) 函数里面有详细说明
// --------------------------------------------------------- PCA_PWM.h----------------------------------------------------------------------------
#ifndef __PCA_PWM_H_
#define __PCA_PWM_H_#include "config.h"
#include "main.h"
/***********************************用户宏定义**********************************/
//#define MAIN_Fosc 11059200
#define PWM_DUTY 255 // 定义PWM的周期,数值为PCA所选择的时钟脉冲个数
#define PWM_HIGH_MIN 1 // 限制PWM输出的最小占空比,避免中断里重装参数时间不够
#define PWM_HIGH_MAX 255//(PWM_DUTY - PWM_HIGH_MIN) // 限制PWM输出最大占空比
/*********************************************************************************/
#define PCA0 0
#define PCA1 1
#define PWM7 2
//-------------------------------------------------------------------------
// Add B7 B6 B5 B4 B3 B2 B1 B0
// AUXR1 A2H S1_S1 S1_S0 CCP_S1 CCP_S0 SPI_S1 SPI_S0 - DSP
// CCP_S1 CCP_S0
// 0 0 PCA_P12_P11_P10_P37
// 0 1 PCA_P34_P35_P36_P37
// 1 0 PCA_P24_P25_P26_P27
//#define PCA_P12_P11_P10_P37 (0<<4)
#define PCA_P34_P35_P36_P37 (1<<4)
#define PCA_P24_P25_P26_P27 (2<<4)
//------------------------------------------------------------------------
// Address B7 B6 B5 B4 B3 B2 B1 B0
// CCAPM0 DAH - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0
// ECOM0: 当 ECOM0 = 1,允许比较功能
// CAPP0: 当 CAPP0 = 1,允许上升沿捕获
// CAPN0: 当 CAPN0 = 1,允许下降沿捕获
// MAT0: 当 MAT0 = 1 时,PCA计数值与模块的比较/捕获寄存器的值的匹配价格置位CCON寄存器中的中断标志位 CCF0
// TOG0: 当 TOG0 = 1 时,工作在PCA高速脉冲输出模式,PCA计数值与模块的比较/捕获寄存器的值的匹配将使CCP0脚翻转
// (CCP0/PCA0/PWM0/P1.1 或 CCP0_2/PCA0/PWM0/P3.5 或 CCP0_3/PCA0/PWM0/P2.5)
// PWM0: 当PWM0 = 1时,允许CCP0脚输出PWM波
// ECCF0: 使能CCF0中断。使能寄存器CCON的比较/捕获标志CCF0,用来产生中断
// CCAPM1 和 CCAPM2 和 CCAPM0 一样
#define PCA_Mode_PWM 0x42 // ECOM0 = 1 PWM0 = 1
//#define PCA_Mode_Capture 0
//#define PCA_Mode_SoftTimwe 0x48 // ECOM0 = 1 MAT0 = 1
//#define PCA_Mode_HighPluseOutput 0x4C // ECOM0 = 1 MAT0 = 1 TOG0 = 1
//#define PCA_Rise_Active (1<<5) // 上升沿捕获 CAPP0 = 1
//#define PCA_Fall_Active (1<<4) // 上升沿捕获 CAPN0 = 1
//---------------------------------------------------------------------------
// Address B7 B6 B5 B4 B3 B2 B1 B0
// CMOD D9H CIDL - - - CPS2 CPS1 CPS0 ECF
// CIDL: CIDL = 0, 空闲模式下PCA计数器继续工作
// CIDL = 1, 空闲模式下PCA计数器停止工作
//
// CPS2 CPS1 CPS0 选择CCP/PCA/PWM时钟源输入
// 0 0 0 (0,系统时钟,SYSclk/12
// 0 0 1 (1, 系统时钟,SYSclk/2
// 0 1 0 (2, 定时器0溢出脉冲。由于定时器0可以工作在1T模式,所以
// 可以达到一个时钟就溢出,从而达到最高频率CPU工作时钟SYSclk
// 通过改变T0的溢出率,可以实现可调频率的PWM输出
// 0 1 1 (3, ECI/P1.2(或P3.4或P2.4)引脚输入外部时钟,(最大速率= SYSclk/2)
// 1 0 0 (4, 系统时钟,SYSclk
// 1 0 1 (5, 系统时钟/4, SYSclk/4
// 1 1 0 (6, 系统时钟/6, SYSclk/6
// 1 1 1 (6, 系统时钟/8, SYSclk/8
/*
例如,CPS2/CPS1/CPS0 = 1/0/0 时,CCP/PCA/PWM时钟源是SYSclk,不用定时器0,PWM的频率为
SYSclk/256
如果要用系统时钟/3来作为PCA的时钟源,应选择T0的溢出作为CCP/PCA/PWM时钟源,此时
应让T0工作在1T模式,计数3个脉冲即将产生溢出。用T0的溢出可对系统进行1~65536级分频,
(T0工作在16位重装载模式)
*/
// ECF: PCA计数溢出中断使能位
// ECF = 0 ,禁止CCON中的CF位中断
// ECF = 1, 允许CCON中的CF位中断
#define PCA_Clock_1T (4<<1)
//#define PCA_Clock_2T (1<<1)
#define PCA_Clock_4T (5<<1)
//#define PCA_Clock_6T (6<<1)
//#define PCA_Clock_8T (8<<1)
#define PCA_Clock_12T (0<<1)
//#define PCA_Clock_Timer0_OF (2<<1)
//#define PCA_Clock_ECI (3<<1)
//---------------------------------------