STC15W4K48S4 它有6通道高精度PWM发生器

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)


//---------------------------------------
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值