[KungFu8位 MCU]

普通PWM参考例程

[复制链接]
1201|2
手机看帖
扫描二维码
随时随地手机跟帖
幸福小强|  楼主 | 2023-3-23 20:33 | 显示全部楼层 |阅读模式
/****************************************************************************************
*
* 文  件  名: main.c
* 项  目  名: 06-General PWM-1
* 版         本: v1.0
* 日         期: 2016年05月16日 11时38分22秒
* 作         者: Administrator
* 程序说明:普通PWM参考例程。
*                         PWM时钟源由T1分频而来,T1时钟源为Fsys/4
* 适用芯片:KF8FXXX系列——KF8F200、KF8F203、KF8F204、KF8F210、KF8F211、KF8F212、KF8F213、
*                                                  KF8F214、KF8F221、KF8F222、KF8F232、KF8F233、KF8F300、KF8F303、
*                                                  KF8F304、KF8F310、KF8F312、KF8F313、KF8F321、KF8F323、KF8F324、
*                                                  KF8F333、KF8F334、KF8F335、KF8F336、···
*                         KF8TS23XX系列——KF8TS2302、KF8TS2308、KF8TS2310、KF8TS2314、···
*                         KF8TS24XX系列——KF8TS2402、KF8TS2408、KF8TS2410、KF8TS2414、···
****************************************************************************************/
#include<KF8F312.h>

#define uchar unsigned char
#define uint  unsigned 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 = 0x50;          //设置为4M

        /***端口初始化****/
        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相关寄存器初始化****/
        T1CTL = 0X01;                        //T1预分频比=1,启动T1
        T1L = 0;
        T1H = 0;
        PP1 = 0xff;                                //PWM1的周期寄存器 ,分辨率为255,T=(255+1)*4*(1/4MHz)*1=256us,F=1/T=3.9KHz
        PP2 = 0xff;                                //PWM2的周期寄存器 ,分辨率为255,T=(255+1)*4*(1/4MHz)*1=256us,F=1/T=3.9KHz
        PWM1L = PP1/2;                        //PWM1初始化占空比为50%
        PWM2L = PP2/2;                        //PWM2初始化占空比为50%

        PWMCTL = 0;                                //关闭PWM1、PWM2
}

/****************************************************************************************
* 函数名     :init_pwm
* 函数功能:pwm功能函数
* 入口参数:无
* 返回          :无
****************************************************************************************/
void pwm_function()
{
        static uchar direction=0;
        if(direction)
        {
                PWM1L++;                                                //PWM1增大占空比
                PWM2L++;                                                //PWM2增大占空比
                if(PWM1L > (PP1-1) )
                {
                        direction=0;                                //换向
                }
        }
        else
        {
                PWM1L--;                                                //PWM1减小占空比
                PWM2L--;                                                //PWM1减小占空比
                if(PWM1L==0)
                {
                        direction=1;                                //换向
                }
        }
}

/****************************************************************************************
* 函数名     :main
* 函数功能:程序入口主函数
* 入口参数:无
* 返回          :无
****************************************************************************************/
void main()
{
        init_mcu();
        init_pwm();
        Delay_ms(10);

        PWM1ON=1;                                                        //开启PWM1
        PWM2ON=1;                                                        //开启PWM2
        while(1)
        {
                pwm_function();
                Delay_ms(10);
        }
}

/****************************************************************************************
* 函数名     :int_fun
* 函数功能:中断入口
* 入口参数:无
* 返回          :无
****************************************************************************************/
void int_fun() __interrupt
{

}


使用特权

评论回复
小本子| | 2023-4-1 16:59 | 显示全部楼层
楼主在吗,有没有试过多路pwm 同时更新占空比的啊

使用特权

评论回复
lingjun1982| | 2023-11-29 21:51 | 显示全部楼层
16MHz的主频请问能否产生100Hz的PWM?
PWM的周期和占空比寄存器是8bits的,即便是最大分频也无法满足,但是项目要求100HzPWM输出……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

107

主题

1395

帖子

2

粉丝