找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4146|回复: 8
打印 上一主题 下一主题
收起左侧

STC8G1K08单片机的PWM为什么没有输出,在定时器0定义IO取反,但是占空比不管用

[复制链接]
跳转到指定楼层
楼主
ID:807182 发表于 2021-5-24 13:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
30黑币
/************************ 定时器配置 ****************************/
void        Timer_config(void)
{
        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
        TIM_InitStructure.TIM_Mode      = TIM_16BitAutoReload;        //指定工作模式,   TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
        TIM_InitStructure.TIM_Polity    = Polity_0;                        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
        TIM_InitStructure.TIM_Interrupt = ENABLE;                                        //中断是否允许,   ENABLE或DISABLE
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T;                //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = ENABLE;                                //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = 65536UL - (MAIN_Fosc / 1000);                //中断频率, 1000次/秒
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer0,&TIM_InitStructure);                                        //初始化Timer0          Timer0,Timer1,Timer2,Timer3,Timer4
}

/***************  串口初始化函数 *****************/
void        PWM_config(void)
{
        PWMx_InitDefine                PWMx_InitStructure;
        
        PWMx_InitStructure.PWM1_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
        PWMx_InitStructure.PWM2_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
        PWMx_InitStructure.PWM3_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
        PWMx_InitStructure.PWM4_Mode    =        CCMRn_PWM_MODE1;        //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2

        PWMx_InitStructure.PWM1_SetPolity  = Polity_0;                        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
        PWMx_InitStructure.PWM2_SetPolity  = Polity_0;                        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
        PWMx_InitStructure.PWM3_SetPolity  = Polity_0;                        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
        PWMx_InitStructure.PWM4_SetPolity  = Polity_0;                        //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3
        
        PWMx_InitStructure.PWM_Period   = 1024;                                                        //周期时间,   0~65535
        PWMx_InitStructure.PWM1_Duty    = PWMA_Duty.PWM1_Duty;        //PWM1占空比时间, 0~Period
        PWMx_InitStructure.PWM2_Duty    = PWMA_Duty.PWM2_Duty;        //PWM2占空比时间, 0~Period
        PWMx_InitStructure.PWM3_Duty    = PWMA_Duty.PWM3_Duty;        //PWM3占空比时间, 0~Period
        PWMx_InitStructure.PWM4_Duty    = PWMA_Duty.PWM4_Duty;        //PWM4占空比时间, 0~Period
        PWMx_InitStructure.PWM_DeadTime = 0;                                                                //死区发生器设置, 0~255
        
        PWMx_InitStructure.PWM_EnoSelect   = ENO1P | ENO1N  ;        //输出通道选择,        ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
        PWMx_InitStructure.PWM_PS_SW       = PWM1_SW_P10_P11 ;        //切换端口,                PWM1_SW_P10_P11,PWM1_SW_P20_P21,PWM1_SW_P60_P61
                                                                                                                                                                                                                        //                                                PWM2_SW_P12_P13,PWM2_SW_P22_P23,PWM2_SW_P62_P63
                                                                                                                                                                                                                        //                                                PWM3_SW_P14_P15,PWM3_SW_P24_P25,PWM3_SW_P64_P65
                                                                                                                                                                                                                        //                                                PWM4_SW_P16_P17,PWM4_SW_P26_P27,PWM4_SW_P66_P67,PWM4_SW_P34_P33

        PWMx_InitStructure.PWM_CC1Enable   = ENABLE;                                //开启PWM1P输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC1NEnable  = ENABLE;                                //开启PWM1N输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC2Enable   = ENABLE;                                //开启PWM2P输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC2NEnable  = ENABLE;                                //开启PWM2N输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC3Enable   = ENABLE;                                //开启PWM3P输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC3NEnable  = ENABLE;                                //开启PWM3N输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC4Enable   = ENABLE;                                //开启PWM4P输入捕获/比较输出,  ENABLE,DISABLE
        PWMx_InitStructure.PWM_CC4NEnable  = ENABLE;                                //开启PWM4N输入捕获/比较输出,  ENABLE,DISABLE
        
        PWMx_InitStructure.PWM_MainOutEnable= ENABLE;                                //主输出使能, ENABLE,DISABLE
        PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;                                //使能计数器, ENABLE,DISABLE
        PWM_Configuration(PWMA, &PWMx_InitStructure);                                //初始化PWM,  PWMA,PWMB
}







定时器中断里面是这样写的

if(!PWM1_Flag)
        {
                PWMA_Duty.PWM1_Duty++;
                if(PWMA_Duty.PWM1_Duty >= 2047) PWM1_Flag = 1;
        }
        else
        {
                PWMA_Duty.PWM1_Duty--;
                if(PWMA_Duty.PWM1_Duty <= 0) PWM1_Flag = 0;
        }

        if(!PWM2_Flag)
        {
                PWMA_Duty.PWM2_Duty++;
                if(PWMA_Duty.PWM2_Duty >= 2047) PWM2_Flag = 1;
        }
        else
        {
                PWMA_Duty.PWM2_Duty--;
                if(PWMA_Duty.PWM2_Duty <= 0) PWM2_Flag = 0;
        }

        if(!PWM3_Flag)
        {
                PWMA_Duty.PWM3_Duty++;
                if(PWMA_Duty.PWM3_Duty >= 2047) PWM3_Flag = 1;
        }
        else
        {
                PWMA_Duty.PWM3_Duty--;
                if(PWMA_Duty.PWM3_Duty <= 0) PWM3_Flag = 0;
        }

        if(!PWM4_Flag)
        {
                PWMA_Duty.PWM4_Duty++;
                if(PWMA_Duty.PWM4_Duty >= 2047) PWM4_Flag = 1;
        }
        else
        {
                PWMA_Duty.PWM4_Duty--;
                if(PWMA_Duty.PWM4_Duty <= 0) PWM4_Flag = 0;
        }
        
        UpdatePwm(PWMA, &PWMA_Duty);





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2021-5-26 09:28 | 只看该作者
STC网站或工具中找个程例就可以。
回复

使用道具 举报

板凳
ID:188720 发表于 2022-8-4 16:37 | 只看该作者
STC8G1K08一个PWM有两个引脚可以输出,但是怎么选择哪一个引脚怎么设置呢?文档里有吗?
回复

使用道具 举报

地板
ID:1034262 发表于 2022-8-4 17:49 | 只看该作者
红烧鱼头 发表于 2022-8-4 16:37
STC8G1K08一个PWM有两个引脚可以输出,但是怎么选择哪一个引脚怎么设置呢?文档里有吗?

手册第3章“功能脚切换”
回复

使用道具 举报

5#
ID:1034262 发表于 2022-8-4 17:51 | 只看该作者
楼主,PWM输出的IO有没有设置为准双向口或推挽输出?
回复

使用道具 举报

6#
ID:213173 发表于 2022-8-4 21:08 | 只看该作者
//适用于STC8G1K08-16/20PIN
#include <STC8.H>

void main()
{
        P1M0 = 0x02;           //P1.1推挽模式
        P1M1 = 0x00;           //P1.1推挽模式
        P3M0 = 0x00;
        P3M1 = 0x00;
        P5M0 = 0x00;
        P5M1 = 0x00;
       
        CCON = 0x00;
        CMOD = 0x08;           //PCA时钟为系统时钟
        CL = 0x00;
        CH = 0x00;
       
        CCAPM0 = 0x42;         //PCA模块0为PWM工作模式
        PCA_PWM0 = 0x00;       //PCA模块0输出8位PWM     
        CCAP0H=CCAP0L=0x80;    //PWM占空比为50%
        //默认P1.1输出PWM,改变CCAP0H值即改变占空比(0xff~0x00=0%~100%)
        while (1);
}
回复

使用道具 举报

7#
ID:631012 发表于 2022-9-8 10:07 来自手机 | 只看该作者
最初接MOS管,发现没有输出,量了一下输出电压1.15v,换成三极管后正常输出,就是频率不能调低了吗。
回复

使用道具 举报

8#
ID:1034262 发表于 2022-9-8 15:55 | 只看该作者
MOS管输入电容较大,PWM频率高时,由于IO有内阻,则等效RC滤波了。
回复

使用道具 举报

9#
ID:999824 发表于 2022-9-8 19:37 | 只看该作者
有冲突应该是,会有问题的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表