📄 pwm.c
字号:
#include "cfg.h"
void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,uint32 PWM_T,uint32 PWM_Rate);
void Func_PWMStart(void);
void Func_PWMReset(void);
void Func_PWMStop(void);
/*********************************************************************************************************
** 函数名称: void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,fp32 PWM_T,fp32 PWM_Rate)
** 功能描述:PWM单边沿输出初始化
* 入口参数:PWM_PR,设置PWM预分频寄存器PWMPR值;
PWM_TC, 设置PWM计数器PWMTC值
Int_PWM_MR0Mod,设置PWMMR0模式,参考PWMMCR的设置,有效值 0~7;
Int_PWM_MRxMod,设置PWMMR(1~6)模式,参考PWMMCR的设置,有效值 0~7;
Int_Channel,PWMx通道,有效值:1~6;
PWM_T,设置PWMx时间,时间为浮点运算,单位为us,
PWM_Rate,设置PWMx占空比,PWM_Rate=50,表示占空比为50%,运算公式:PWMMRx=PWMMR0*100/PWM_Rate;
对PWM0~PWM6同时使用的设置时,PWM_PR、PWM_TC的参数必须相同
* 出口参数:无
********************************************************************************************************/
void Func_PWM_Single_Adge_Init(uint32 PWM_PR,uint32 PWM_TC,uint8 Int_PWM_MR0Mod,uint8 Int_PWM_MRxMod,uint8 Int_Channel,uint32 PWM_T,uint32 PWM_Rate)
{ PWMPR=PWM_PR;
PWMTC=PWM_TC;
/* PWMPCR= 0<<0 | //[1:0]无定义
0<<2 | //PWMSEL2=0:PWM2选择单边沿;1:双边沿
0<<3 | //PWMSEL3=0:PWM2选择单边沿;1:双边沿
0<<4 | //PWMSEL4=0:PWM2选择单边沿;1:双边沿
0<<5 | //PWMSEL5=0:PWM2选择单边沿;1:双边沿
0<<6 | //PWMSEL6=0:PWM2选择单边沿;1:双边沿
0<<7 | //[8:7]无定义
0<<9 | //PWMENA1=1:PWM1输出;0:禁止
0<<10 | //PWMENA2=1:PWM2输出;0:禁止
0<<11 | //PWMENA3=1:PWM3输出;0:禁止
0<<12 | //PWMENA4=1:PWM4输出;0:禁止
0<<13 | //PWMENA5=1:PWM5输出;0:禁止
0<<14 | //PWMENA6=1:PWM6输出;0:禁止
0<<15 ; //[31:15]无定义
*/
PWMPCR=1 << Int_Channel+8 ;
PWMMR0=(Fpclk/(PWMPR+1)/1000000-PWMTC)*PWM_T; //Fpclk=10MHz,PWMPR=0,PWMTC=0,PWM_T=1us,每个PWMTC为0.1us,则PWMMR0=10
switch(Int_Channel)
{ case 0x01:PWMMR1=PWMMR0*PWM_Rate/100;break; //占空比
case 0x02:PWMMR2=PWMMR0*PWM_Rate/100;break;
case 0x03:PWMMR3=PWMMR0*PWM_Rate/100;break;
case 0x04:PWMMR4=PWMMR0*PWM_Rate/100;break;
case 0x05:PWMMR5=PWMMR0*PWM_Rate/100;break;
case 0x06:PWMMR6=PWMMR0*PWM_Rate/100;break;
}
/*
PWMMCR= 0<<0 | //PWMMR0中断,1:PWMMR0与PWMTC值相匹配时将产生中断; 0:禁止
0<<1 | //PWMMR0复位,1:PWMMR0与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<2 | //PWMMR0停止,1:PWMMR0与PWMTC值相匹配时将产生停止; 0:禁止
0<<3 | //PWMMR1中断,1:PWMMR1与PWMTC值相匹配时将产生中断; 0:禁止
0<<4 | //PWMMR1复位,1:PWMMR1与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<5 | //PWMMR1停止,1:PWMMR1与PWMTC值相匹配时将产生停止; 0:禁止
0<<6 | //PWMMR2中断,1:PWMMR2与PWMTC值相匹配时将产生中断; 0:禁止
0<<7 | //PWMMR2复位,1:PWMMR2与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<8 | //PWMMR2停止,1:PWMMR2与PWMTC值相匹配时将产生停止; 0:禁止
0<<9 | //PWMMR3中断,1:PWMMR3与PWMTC值相匹配时将产生中断; 0:禁止
0<<10 | //PWMMR3复位,1:PWMMR3与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<11 | //PWMMR3停止,1:PWMMR3与PWMTC值相匹配时将产生停止; 0:禁止
0<<12 | //PWMMR4中断,1:PWMMR4与PWMTC值相匹配时将产生中断; 0:禁止
0<<13 | //PWMMR4复位,1:PWMMR4与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<14 | //PWMMR4停止,1:PWMMR4与PWMTC值相匹配时将产生停止; 0:禁止
0<<15 | //PWMMR5中断,1:PWMMR5与PWMTC值相匹配时将产生中断; 0:禁止
0<<16 | //PWMMR5复位,1:PWMMR5与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<17 | //PWMMR5停止,1:PWMMR5与PWMTC值相匹配时将产生停止; 0:禁止
0<<18 | //PWMMR6中断,1:PWMMR6与PWMTC值相匹配时将产生中断; 0:禁止
0<<19 | //PWMMR6复位,1:PWMMR6与PWMTC值相匹配时将PWMTC产生复位; 0:禁止
0<<20 | //PWMMR6停止,1:PWMMR6与PWMTC值相匹配时将产生停止; 0:禁止
0<<21 ; //[32:21]无定义
*/
PWMMCR = PWMMCR & 0x1FFFF8 | Int_PWM_MR0Mod ;
//PWMMCR = 111 111 111 111 111 111 000
//设置PWMMR0模式
switch(Int_Channel)
{ case 0x01:PWMMCR=PWMMCR & 0x1FFFC7 |Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 111 111 111 111 111 000 111 << (3* PWM_Channel);
//设置PWMMR1模式
case 0x02:PWMMCR=PWMMCR & 0x1FFE3F |Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 111 111 111 111 000 111 111 << (3* PWM_Channel);
//设置PWMMR2模式
case 0x03:PWMMCR=PWMMCR & 0x1FF1FF |Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 111 111 111 000 111 111 111 << (3* PWM_Channel);
//设置PWMMR3模式
case 0x04:PWMMCR=PWMMCR & 0x1F8FFF |Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 111 111 000 111 111 111 111 << (3* PWM_Channel);
//设置PWMMR4模式
case 0x05:PWMMCR=PWMMCR & 0x1C3FFF | Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 111 000 111 111 111 111 111 << (3* PWM_Channel);
//设置PWMMR5模式
case 0x06:PWMMCR=PWMMCR & 0x03FFFF |Int_PWM_MRxMod <<(3 *Int_Channel);break;
//PWMMCR = 000 111 111 111 111 111 111 << (3* PWM_Channel);
//设置PWMMR6模式
}
/*
PWMLER= 0<<1 | //使能PWMMR0锁存,1:使能,写入PWMMR0的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR1锁存,1:使能,写入PWMMR1的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR2锁存,1:使能,写入PWMMR2的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR3锁存,1:使能,写入PWMMR3的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR4锁存,1:使能,写入PWMMR4的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR5锁存,1:使能,写入PWMMR5的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<0 | //使能PWMMR6锁存,1:使能,写入PWMMR6的新值才能在PWMMR0发生匹配后生效;0:禁止
0<<1 ; //无定义
*/
PWMLER= 1<<0 |
1<<Int_Channel ;
}
/*********************************************************************************************************
** 函数名称: Func_PWMStart()
** 功能描述:PWM使能并开始计数
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void Func_PWMStart(void)
{ PWMTCR= 1<<0 | //计数器使能,1:使能;0:停止
0<<1 | //计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
0<<2 | //无定义
1<<3 | //PWM使能,1:使能;0:停止
0<<4 ; //[7:4]无定义
}
/*********************************************************************************************************
** 函数名称: Func_PWMReset()
** 功能描述:PWM复位
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void Func_PWMReset(void)
{ PWMTCR= 1<<0 | //计数器使能,1:使能;0:停止
1<<1 | //计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
0<<2 | //无定义
1<<3 | //PWM使能,1:使能;0:停止
0<<4 ; //[7:4]无定义
}
/*********************************************************************************************************
** 函数名称: Func_PWMStop()
** 功能描述:PWM停止,计数器停止
* 入口参数:无
* 出口参数:无
********************************************************************************************************/
void Func_PWMStop(void)
{ PWMTCR= 0<<0 | //计数器使能,1:使能;0:停止
0<<1 | //计数器复位,1:PWMPC、PWMTC在下一个上升没复位,等PWMPC、PWMTC复位完成后,该位清0
0<<2 | //无定义
0<<3 | //PWM使能,1:使能;0:停止
0<<4 ; //[7:4]无定义
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -