ChipON系列增强型PWM操作例程分享
/*****************************************************************************************
* 文件名: main.c
* 项目名: 08-Enganced PWM-Half_Bridg_Output-PWM3
* 版 本: v1.0
* 日 期: 2016年05月19日 10时48分57秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 半桥输出模式PWM3
* 适用芯片:KF8FXXX系列——KF8F211、KF8F212、KF8F213、
* KF8F214、KF8F221、KF8F222、KF8F232、KF8F233、
* KF8F312、KF8F313、KF8F321、KF8F323、
* KF8F334、KF8F335、KF8F336、···
****************************************************************************************/
#include<KF8F312.h>
#define uchar unsigned char
#define uintunsigned int
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0X60; // 8M时钟
/***端口初始化****/
TR0 = 0x08; //设置P03端口为输入,P0其他I/O口为输出
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0; //P0口输出低电平
P1 = 0; //P1口输出低电平
P2 = 0; //P2口输出低电平
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
PWM3CTL1=0x0F; // 不开启自动使能,死区时间设定为0x0f 即当前延时T = 15*(4*(1/8M)) = 15*500ns = 7.5us
P3ASCTL=0x00; // 禁止自动关闭源,默认关闭状态为1。
PATRCTL=0x10; // 开启转向同步。
PWM3CTL0=0x80;// 半桥输出模式,暂不开启PWM3,默认有效状态高电平。
PWM3L=0x32; // 占空比初始化 50%,=(PWM3L:(PDT1:PDT0))/(4*(PP3+1))=00110010:00/4*(0X63+1)=50%
PDT1=0; // IN PWM3CTL0 bit 5
PDT0=0; // IN PWM3CTL0 bit 4
PP3=0x63; // 4倍数值构成PWM周期最小单位=(99+1)*4*(1/8MHz)*1=50us,F=1/T=20KHz
// PWM使能
T2=0;
T2CTL=0x04; // 启动T2,分频器1为1分频
P3ON1=1; // IN PWM3CTL0 bit 3
P3ON0=1; // IN PWM3CTL0 bit 2
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
Delay_ms(10);
while(1)
{
pwm_function();
Delay_ms(100);
}
}
/****************************************************************************************
* 函数名 :int_fun
* 函数功能:中断入口
* 入口参数:无
* 返回 :无
****************************************************************************************/
void int_fun() __interrupt
{
}
/****************************************************************************************
*
* 文件名: main.c
* 项目名: 08-Enganced PWM-Half_Bridg_Output-PWM4
* 版 本: v1.0
* 日 期: 2016年05月19日 10时48分57秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 半桥输出模式PWM4
* 适用芯片:KF8VXXX系列——KF8V216、KF8V218
****************************************************************************************/
#include<KF8V216.h>
#define uchar unsigned char
#define uintunsigned int
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0X70; // 16M时钟
/***端口初始化****/
TR0 = 0x08; //设置P03端口为输入,P0其他I/O口为输出
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0;
P0LR = 0; //P0口输出低电平
P1LR = 0; //P1口输出低电平
P2LR = 0; //P2口输出低电平
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
PWM4CTL1=0x0F; // 不开启自动使能,死区时间设定为0x0f 即当前延时T = 15*(1/16M) = 15*62.5ns = 937.5ns
P4ASCTL=0x00; // 禁止自动关闭源,默认关闭状态为1。
PATRCTL=0x10; // 开启转向同步,全部输出,0x11 P3A 0x12 P3B0x14 P3C 0x18 P3D
PP4H=0X00;
PP4L=0XFF; //T=(0X00FF+1)*(1/16MHz)*1=16us,F=1/T=62.5KHz
PWM4L0=0X80; //初始化占空比0X0080/(0X00FF+1)=50%
PWM4L1=0X00;
/****T2使能******/
T2H=0;
T2L=0;
T2CTL=0X04; // 启动T2,T2分频比1
PWM4CTL0=0x8C;//半桥输出模式,默认有效状态高电平。
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
static uchar direction=0;
if(direction)
{
PWM4L0++;
if(PWM4L0>=200)
{
direction=0;
}
}
else
{
PWM4L0--;
if(PWM4L0<100)
{
direction=1;
}
}
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
Delay_ms(10);
while(1)
{
pwm_function();
Delay_ms(10);
}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
}
/****************************************************************************************
*
* 文件名: main.c
* 项目名: 08-Enganced PWM-Half_Bridg_Output-PWM5
* 版 本: v1.0
* 日 期: 2016年05月16日 11时38分22秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 半桥输出模式PWM5
* 适用芯片:KF8FX156系列——KF8F2156、KF8F3156、KF8F4156
* KF8FX155系列——KF8F3155、KF8F4155
* KF8F4158系列——KF8F4158
* KF8VXXX系列——KF8V429
****************************************************************************************/
#include<KF8F4156.h>
#define uchar unsigned char
#define uintunsigned int
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0x70; //设置为16M
/***端口初始化****/
TR0 = 0x08; //设置P03端口为输入,P0其他I/O口为输出
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
TR3 = 0x00; //设置P3端口为输出
P0 = 0;
P1 = 0;
P2 = 0;
P3 = 0;
P0LR = 0; //P0口输出低电平
P1LR = 0; //P1口输出低电平
P2LR = 0; //P2口输出低电平
P3LR = 0; //P3口输出低电平
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
P5ASCTL = 0b00000000; //设置PWM5关闭时候PWM口输出电平 这里为默认设置,关闭PWM时候都输出0
PWM5CTL2 = 0b00000001; //PWM周期自动填充更新
PWM5CTL0 = 0b10001100; //半桥输出PWM高电平有效 PWM5APWM5B作为互补输出
PWM5CTL1 = 0b00000011; //死区时间设置 死区时间为一个T2时间基准 这里设置为3基准时间
PP5H = 0; //高位
PP5L = 40; //低位 设置PWM周期周期时间为PP5+1进行计算
PWM5L1 = 0; //高位
PWM5L0 = 20; //地位 设置PWM占空比
T2H = 0;
T2L = 0; //PWM时钟源 T2相关设置
T2CTL0 = 0b00000000;
T2ON = 1;
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
Delay_ms(10);
while(1)
{
pwm_function();
Delay_ms(10);
}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
}
/****************************************************************************************
*
* 文件名: main.c
* 项目名: 09-Enganced PWM-Full_Bridge_Output-PWM3
* 版 本: v1.0
* 日 期: 2016年05月19日 10时48分57秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 全桥输出模式PWM3
* 适用芯片:KF8FXXX系列——KF8F211、KF8F212、KF8F213、
* KF8F214、KF8F221、KF8F222、KF8F232、KF8F233、
* KF8F312、KF8F313、KF8F321、KF8F323、
* KF8F334、KF8F335、KF8F336、···
****************************************************************************************/
#include<KF8F312.h>
#define uchar unsigned char
#define uintunsigned int
unsigned char Full_Bridge_Way;//全桥正向反向标记 1 正向 0 反向
unsigned char Full_PWM_Bak; //占空比高位备份,全桥转向防直通措施
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0X60; // 8M时钟
/***端口初始化****/
TR0 = 0x0C; //设置P03端口为输入,P0其他I/O口为输出,P02设为自动关断源,所以设为上拉输入
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0; //P0口输出低电平
P1 = 0; //P1口输出低电平
P2 = 0; //P2口输出低电平
PUPH = 0; // 使能总上拉 PUPH
PUR = 0X04; // 使能P02上拉,P02设为自动关断源,所以设为上拉输入
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
PWM3CTL1=0x80; // 开启自动使能,死区仅对半桥有效
P3ASCTL=0x44; // 选择自动关闭源 INT0(P02)为低电平 关闭状态下P3A、P3C端口为高电平 P3B、P3D端口为低电平
PATRCTL=0x10; // 开启转向同步。
PWM3CTL0=0x40;// 全桥正向输出模式,暂不开启,默认有效状态高电平。
Full_Bridge_Way=1;
PWM3L=0x32; // 占空比初始化 50%,=(PWM3L:(PDT1:PDT0))/(4*(PP3+1))=00110010:00/4*(0X63+1)=50%
PDT1=0; // IN PWM3CTL0 bit 5
PDT0=0; // IN PWM3CTL0 bit 4
PP3=0x63; // 4倍数值构成PWM周期最小单位=(99+1)*4*(1/8MHz)*4=200us,F=1/T=5KHz
// PWM使能
T2=0;
T2CTL=0x05; // 启动T2,分频器1为4分频
P3ON1=1; // IN PWM3CTL0 bit 3
P3ON0=1; // IN PWM3CTL0 bit 2
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
//全桥转向,需防止接近百分百占空比下的,开关管导通时间小于截止时间时的直通,-
//如果占空比运行模式均小于一定值,可以不考虑直通现象,详细介绍见数据手册。
if(Full_Bridge_Way)
{
Full_PWM_Bak=PWM3L;
PWM3L=0x3F; // 暂时降低占空比
Delay_ms(1); // 延后1个周期的时间,使占空比生效
PWM3CTL0|=0x80;
Full_Bridge_Way=0;
PWM3L=Full_PWM_Bak; // 占空比还原
}
else
{
Full_PWM_Bak=PWM3L;
PWM3L=0x3F; // 暂时降低占空比
Delay_ms(1); // 延后1个周期的时间,使占空比生效
PWM3CTL0&=0x7F;
Full_Bridge_Way=1;
PWM3L=Full_PWM_Bak; // 占空比还原
}
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
Delay_ms(10);
while(1)
{
pwm_function();
Delay_ms(50);
}
}
/****************************************************************************************
* 函数名 :int_fun
* 函数功能:中断入口
* 入口参数:无
* 返回 :无
****************************************************************************************/
void int_fun() __interrupt
{
}
/****************************************************************************************
*
* 文件名: main.c
* 项目名: 09-Enganced PWM-Full_Bridge_Output-PWM4
* 版 本: v1.0
* 日 期: 2016年05月19日 10时48分57秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 全桥输出模式PWM4
* 适用芯片:KF8VXXX系列——KF8V216、KF8V218
****************************************************************************************/
#include<KF8V216.h>
#define uchar unsigned char
#define uintunsigned int
unsigned char Full_Bridge_Way;//全桥正向反向标记 1 正向 0 反向
unsigned char Full_PWM_Bak; //占空比高位备份,全桥转向防直通措施
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0X70; // 16M时钟
/***端口初始化****/
TR0 = 0x0C; //设置P03端口为输入,P0其他I/O口为输出,P02设为自动关断源,所以设为上拉输入
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
P0 = 0;
P1 = 0;
P2 = 0;
P0LR = 0; //P0口输出低电平
P1LR = 0; //P1口输出低电平
P2LR = 0; //P2口输出低电平
PUPH = 0; // 使能总上拉 PUPH
PUR = 0X04; // 使能P02上拉,P02设为自动关断源,所以设为上拉输入
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
PWM4CTL1=0x80; // 开启自动使能,死区仅对半桥有效
P4ASCTL=0x44; // 选择自动关闭源 INT0(P02)为低电平 关闭状态下P3A、P3C端口为高电平 P3B、P3D端口为低电平
PATRCTL=0x10; // 开启转向同步
PP4H=0X00;
PP4L=0XFF; //T=(0X00FF+1)*(1/16MHz)*1=16us,F=1/T=62.5KHz
PWM4L0=0X80; //初始化占空比0X0080/(0X00FF+1)=50%
PWM4L1=0X00;
/****T2使能******/
T2H=0;
T2L=0;
T2CTL=0X04; // 启动T2,T2分频比1
PWM4CTL0=0x4C;// 全桥正向输出模式,默认有效状态高电平。
Full_Bridge_Way=1;
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
//全桥转向,需防止接近百分百占空比下的,开关管导通时间小于截止时间时的直通,-
//如果占空比运行模式均小于一定值,可以不考虑直通现象,详细介绍见数据手册。
if(Full_Bridge_Way)
{
Full_PWM_Bak=PWM4L0;
PWM4L0=0x3F; // 暂时降低占空比
Delay_ms(1); // 延后1个周期的时间,使占空比生效
PWM4CTL0|=0x80;
Full_Bridge_Way=0;
PWM4L0=Full_PWM_Bak; // 占空比还原
}
else
{
Full_PWM_Bak=PWM4L0;
PWM4L0=0x3F; // 暂时降低占空比
Delay_ms(1); // 延后1个周期的时间,使占空比生效
PWM4CTL0&=0x7F;
Full_Bridge_Way=1;
PWM4L0=Full_PWM_Bak; // 占空比还原
}
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
Delay_ms(10);
while(1)
{
pwm_function();
Delay_ms(10);
}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
}
/****************************************************************************************
*
* 文件名: main.c
* 项目名: 09-Enganced PWM-Full_Bridge_Output-PWM5
* 版 本: v1.0
* 日 期: 2016年05月16日 11时38分22秒
* 作 者: Administrator
* 程序说明:增强型PWM参考例程。
* 全桥输出模式PWM5
* 适用芯片:KF8FX156系列——KF8F2156、KF8F3156、KF8F4156
* KF8FX155系列——KF8F3155、KF8F4155
* KF8F4158系列——KF8F4158
* KF8VXXX系列——KF8V429
****************************************************************************************/
#include<KF8F4156.h>
#define uchar unsigned char
#define uintunsigned int
unsigned charTimeCnt;
unsigned charPSTRCTLTEMP;
unsigned char PWM5CTL0TEMP;
/****************************************************************************************
* 函数名 :Delay_ms
* 函数功能:长时间延时
* 入口参数:延时基数 uchar ms_data
* 返回 :无
****************************************************************************************/
void Delay_ms(uint ms_data)
{
uchar i;
while(ms_data--)
{
i = 124;
while(i--);
}
}
/****************************************************************************************
* 函数名 :init_mcu
* 函数功能:mcu初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_mcu()
{
/***时钟初始化****/
OSCCTL = 0x70; //设置为16M
/***端口初始化****/
TR0 = 0x08; //设置P03端口为输入,P0其他I/O口为输出
TR1 = 0x00; //设置P1端口为输出
TR2 = 0x00; //设置P2端口为输出
TR3 = 0x00; //设置P3端口为输出
P0 = 0;
P1 = 0;
P2 = 0;
P3 = 0;
P0LR = 0; //P0口输出低电平
P1LR = 0; //P1口输出低电平
P2LR = 0; //P2口输出低电平
P3LR = 0; //P3口输出低电平
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm初始化函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void init_pwm()
{
/***PWM相关寄存器初始化****/
P5ASCTL = 0b00000000; //设置PWM5关闭时候PWM口输出电平 这里为默认设置,关闭PWM时候都输出0
PWM5CTL2 = 0b00000001; //PWM周期自动填充更新
PWM5CTL0 = 0b01001100; //初始化先先正向全桥输出
PSTRCTL = 0b00011001; //PWM单项输出时候,和全桥输出时候,PWM信号控制是否输出到相应IO上, PSTRCTL(3:0)分别为P5D P5C P5B P5A
PP5H = 0; //高位
PP5L = 40; //低位 设置PWM周期周期时间为PP5+1进行计算
PWM5L1 = 0; //高位
PWM5L0 = 20; //地位 设置PWM占空比
T2H = 0;
T2L = 0; //PWM时钟源 T2相关设置
T2CTL0 = 0b00000000;
T2ON = 1;
}
/********************************************
*函数名称:T0TimeTurnOnFun
*函数功能:开启定时器0
*输入参数:无
*输出参数:无
* **********************************************/
void T0TimeTurnOnFun()
{
T0CS = 0;
PSA = 0;
PS2 = 1;
PS1 = 1;
PS0 = 1;
T0= 240;
T0IE = 1;
AIE = 1;
}
/****************************************************************************************
* 函数名 :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void pwm_function()
{
if(TimeCnt>25) //25ms变化一次 周期为50HZ
{
TimeCnt = 0 ;
PSTRCTLTEMP = PSTRCTL;
PSTRCTLTEMP ^= 0b00001111; //取反全桥模式,正向和反向切换
PWM5CTL0TEMP = PWM5CTL0;
PWM5CTL0TEMP ^= 0b10000000;
PSTRCTL = 0;
PWM5CTL0 =0;
_NOP(); //全桥模式正向和反向切换进行延时
_NOP();
_NOP();
_NOP();
PSTRCTL = PSTRCTLTEMP;
PWM5CTL0 = PWM5CTL0TEMP;
}
}
/****************************************************************************************
* 函数名 :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回 :无
****************************************************************************************/
void main()
{
init_mcu();
init_pwm();
T0TimeTurnOnFun();
Delay_ms(10);
while(1)
{
pwm_function();
}
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
if(T0IF) //定时中断 1ms
{
T0IF = 0;
T0= 240;
TimeCnt++;
}
}
//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{
}
支持下,就是中断有点乱的。
页:
[1]