📄 pwm.c
字号:
//[PWM.c]脉宽调制----------------------------------------------------------*
//本文件包含: *
// (1)PWMInit:PWM初始化 *
// (2)PWMSetting:设置PWM周期和占空比设置 *
//-------------------------------------------------------------------------*
//头文件
#include "PWM.h" //脉宽调制头文件
//PWMInit:PWM初始化--------------------------------------------------------*
//功 能:PWM初始化,A,B时钟频率均设为8MHz *
//参 数: *
// channel-通道号,polarity-极性,align-对齐方式, *
// polarity:0-负极性,1-正极性,align:0-左对齐,1-中心对齐 *
//返 回:无 *
//-------------------------------------------------------------------------*
void PWMInit(INT8U channel,INT8U polarity,INT8U align)
{
INT8U i,j;
//1 禁止通道channel
j = 0x01;
for (i=0; i<channel; i++) //禁止通道channel
j = j<<1;
PWME &= ~j;
//2 PWM时钟源选择,选择X时钟作为channel的时钟源
j = 0x01;
for (i=0; i<channel; i++)
j = j<<1;
PWMCLK &= ~j;
//3 设置A,B的时钟频率
switch (channel)
{
//通道0,1,4,5使用A时钟,A时钟频率=19.6608MHz/128
case 0:
case 1:
case 4:
case 5:
PWMPRCLK |= 0x07;
break;
//通道2,3,6,7使用B时钟,B时钟频率=19.6608MHz/128
case 2:
case 3:
case 6:
case 7:
PWMPRCLK |= 0x70;
break;
default:
break;
}
//4 确定channel输出极性
j = 0x01;
if (polarity == 1) //正极性
{
for (i=0; i<channel; i++)
j = j<<1;
PWMPOL |= j;
}
else
{ //负极性
for (i=0; i<channel; i++)
j = j<<1;
PWMPOL &= ~j;
}
//5 确定channel输出方式
j = 0x01;
if (align == 0) //左对齐
{
for (i=0; i<channel; i++)
j = j<<1;
PWMCAE &= ~j;
}
else //中心对齐
{
for (i=0; i<channel; i++)
j = j<<1;
PWMCAE |= j;
}
//6 清0通道channel计数器
PWMCNT0 = 0;
}
//PWMSetting:PWM周期和占空比设置-------------------------------------------*
//功 能:根据参数设置f周期和占空比 *
//参 数: *
// period=PWM周期所占用的时钟周期个数 *
// duty=PWM占空比所占用的时钟周期个数 *
// Channel=所要设置的通道号(0~7) *
//返 回:无 *
//说 明:duty的值<=period的值,并且两者的值都在0~255之间 *
//-------------------------------------------------------------------------*
void PWMSetting(INT8U channel,INT8U period,INT8U duty)
{
switch(channel)
{
case 0:
PWMCNT0 = 0x00; //清通道0计数器
PWMDTY0 = duty; //设置周期寄存器
PWMPER0 = period; //设置占空比寄存器
break;
case 1:
PWMCNT1 = 0x00; //清通道1计数器
PWMDTY1 = duty; //设置周期寄存器
PWMPER1 = period; //设置占空比寄存器
break;
case 2:
PWMCNT2 = 0x00; //清通道2计数器
PWMDTY2 = duty; //设置周期寄存器
PWMPER2 = period; //设置占空比寄存器
break;
case 3:
PWMCNT3 = 0x00; //清通道3计数器
PWMDTY3 = duty; //设置周期寄存器
PWMPER3 = period; //设置占空比寄存器
break;
case 6:
PWMCNT6 = 0x00; //清通道6计数器
PWMDTY6 = duty; //设置周期寄存器
PWMPER6 = period; //设置占空比寄存器
break;
case 7:
PWMCNT7 = 0x00; //清通道7计数器
PWMDTY7 = duty; //设置周期寄存器
PWMPER7 = period; //设置占空比寄存器
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -