找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用ch552芯片,设置脉冲输出,按键改变脉宽,不能实现,是什么问题呢,求解

[复制链接]
跳转到指定楼层
楼主
ID:858009 发表于 2021-9-13 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qwettyuio 于 2021-9-14 15:09 编辑


#include "CH552.H"                                                  
#include "Debug.H"
#include "Timer.H"
#include "stdio.h"
#include "GPIO.H"
#pragma  NOAREGS

sbit LED1 = P3^4;
sbit led2 = P1^3;
sbit key = P1^4;
unsigned int condition=0;//这里高电平占一份
unsigned int cnt;                  //整个周期
void button();
void main( )
{
    CfgFsys( );                                                                //CH554时钟选择配置   
    mDelaymS(5);                                                               //修改主频,建议稍加延时等待主频稳定         
        Port3Cfg(1,4);
        Port1Cfg(1,3);
        Port1Cfg(3,4);
    mTimer0Clk12DivFsys();                                                           //T0定时器时钟设置
    mTimer_x_ModInit(0,2);                                                     //T0 定时器模式设置
    mTimer_x_SetData(0,0x5555);                                                       //T0定时器赋值
    mTimer0RunCTL(1);                                                          //T0定时器启动        
    ET0 = 1;                                                                   //T0定时器中断开启               
    EA = 1;
    while(1)
        {
                if(cnt>=100)
                {
                        LED1=0;
                }
                if(cnt<condition)
                {
                        LED1=1;
                }
                else
                {
                        LED1=0;
                }
                button();
        }
}
void Time0Interrupt(void) interrupt INT_NO_TMR0 using 1
{
        mTimer_x_SetData(0,0x5555);                                                       //T0定时器赋值
    cnt++;
}
void button()
{
        if(key==0)
        {
                mDelaymS(5);
                if(key==0)
                {
                        condition=condition+30;         //调制脉宽
            led2=!led2;                                //led灯反转
            if(condition>=90)                //如果脉宽等于总周期了等于0
                        {
                                condition=90;
            }
            while(!key);                          //等待按键松手
                }
        }
}


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

使用道具 举报

沙发
ID:624769 发表于 2021-9-13 13:23 | 只看该作者
CH552 系统时钟配置寄存器 不是 (CLOCK_CFG)么?
你那个    CfgFsys( );   哪里来的?  看你用的都是封装函数, 很多功能只能猜, 改变时钟要进入安全模式,
你那个 CfgFsys( ); 里面有没有包含  SAFE_MOD = 0x55;  SAFE_MOD = 0xAA;  如果没有包含是改不了时钟的。
回复

使用道具 举报

板凳
ID:858009 发表于 2021-9-13 14:12 | 只看该作者
188610329 发表于 2021-9-13 13:23
CH552 系统时钟配置寄存器 不是 (CLOCK_CFG)么?
你那个    CfgFsys( );   哪里来的?  看你用的都是封装函 ...

void        CfgFsys( )  
{
//                 SAFE_MOD = 0x55;
//                 SAFE_MOD = 0xAA;
//     CLOCK_CFG |= bOSC_EN_XT;                          //使能外部晶振
//     CLOCK_CFG &= ~bOSC_EN_INT;                        //关闭内部晶振   
                SAFE_MOD = 0x55;
                SAFE_MOD = 0xAA;
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x07;  // 32MHz       
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x06;  // 24MHz       
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x05;  // 16MHz       
                CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x04;  // 12MHz
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x03;  // 6MHz       
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x02;  // 3MHz       
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x01;  // 750KHz       
//                 CLOCK_CFG = CLOCK_CFG & ~ MASK_SYS_CK_SEL | 0x00;  // 187.5MHz               
                SAFE_MOD = 0x00;
}
回复

使用道具 举报

地板
ID:858009 发表于 2021-9-13 14:12 | 只看该作者
188610329 发表于 2021-9-13 13:23
CH552 系统时钟配置寄存器 不是 (CLOCK_CFG)么?
你那个    CfgFsys( );   哪里来的?  看你用的都是封装函 ...

有这个设置的
回复

使用道具 举报

5#
ID:624769 发表于 2021-9-13 14:24 | 只看该作者

所以,你的“不能实现”,到底怎么个意思?
回复

使用道具 举报

6#
ID:858009 发表于 2021-9-13 15:54 | 只看该作者
188610329 发表于 2021-9-13 14:24
所以,你的“不能实现”,到底怎么个意思?

改变不了脉宽输出,用示波器检测,按键按下的时候,输出的波形脉宽是不变的,就实现不了控制变速小电机控制
回复

使用道具 举报

7#
ID:624769 发表于 2021-9-13 16:10 | 只看该作者
                if(key==0)
                {
                        condition=condition+30;         //调制脉宽
            led2=!led2;                                //led灯反转
            if(condition>=90)                //如果脉宽等于总周期了等于0
                        {
                                condition=90;


以上这段, condition 每次 +30, 当 90 之后 就永远是 90 了,
再来看看这段:
              if(cnt>=100)
                {
                        LED1=0;
                }
                if(cnt<condition)
                {
                        LED1=1;
                }
                else
                {
                        LED1=0;

因为你 condition 永远 = 90  所以, cnt 要么 <= 100  LED1 = 0, 要么 cnt >100 就一定也 > 永远
=90 的 condiction,LED1 还是 =0; 所以 LED1 也永远= 0;

所以,我真看不出来, 你这段代码,可以变化的地方……

最后,CH552 不是自带 PWM 么, 为什么非要用定时器呢?
而且,CH552属于“产品向”的MCU, 你作为初学者,还是用 “学习向”的MCU比较好,不然成本太高,你消耗不起。
回复

使用道具 举报

8#
ID:858009 发表于 2021-9-14 10:00 | 只看该作者
188610329 发表于 2021-9-13 16:10
if(key==0)
                {
                        condition=condition+30;       ...

这是在学习型51单片机上试用成功,然后在使用ch552芯片的,想知道为什么不能实现,哪里出了问题
回复

使用道具 举报

9#
ID:624769 发表于 2021-9-14 13:06 | 只看该作者
qwettyuio 发表于 2021-9-14 10:00
这是在学习型51单片机上试用成功,然后在使用ch552芯片的,想知道为什么不能实现,哪里出了问题

前面回复里,我已经写了,
你整个程序,唯一能动的地方就是 button ,
但是,你按下 button 之后 唯一的变化就是         led2=!led2;                                //led灯反转
除此之外,没有其他任何东西能改变。
所以你说之前在其他的51单片机上试用成功,我相当的不解……

最后,我说的是“产品向”,和“学习向”  不是“型” ,任何单片机都可以学习,但是面向不同,CH552主要是针对产品生产的,所以用不了几次,学习的话,非常不适合。我忘了是CH559 还是 CH554 的  更加适合学习,你可以看一下手册。
回复

使用道具 举报

10#
ID:858009 发表于 2021-9-14 15:08 | 只看该作者
188610329 发表于 2021-9-14 13:06
前面回复里,我已经写了,
你整个程序,唯一能动的地方就是 button ,
但是,你按下 button 之后 唯一 ...

这是51的控制,我也不知道什么原因
#include <REGX51.H>
unsigned int condition=0;//这里高电平占一份
unsigned int cnt;                  //整个周期
sbit pin=P2^0;                          //定义pwm输出口
sbit led=P1^0;                          //定义了一个led灯判断按键是否按下
sbit key=P3^0;                          //定义开关
void button();
void delay(unsigned int t)        //延时函数
{
        while(t--);
}
void main()
{
    TMOD=0x01;                                 //定时器初始化
    TL0 = 0xff;                //设置定时初值
    TH0 = 0xFF;
    EA=1;
    ET0=1;               
    TR0 = 1;
    while(1)
        {
                if(cnt>=100)//整个周期100
                {
                        cnt=0;
                }
        if(cnt<condition)   //如果脉宽大于总周期,输出高电平      
        {
            pin=1;
        }
        else                           //否则输出低电平
        {
            pin=0;
        }  
                button();           //按键检测
    }
}
void Isr01() interrupt 1         //定时器时间到了进入中断服务
{
        TL0 = 0xff;                //设置定时初值
    TH0 = 0xFF;
    cnt++;
}
void button()           //按下开关改变上升沿的时间
{
        if(key!=1)                        //检测按键是否按下
        {
                delay(50);           //延时判断
        if(key!=1)           //检测按键是否按下
                {
                        condition=condition+30;         //调制脉宽
            led=!led;                                //led灯反转
            if(condition>=100)                //如果脉宽等于总周期了等于0
                        {
                                condition=0;
            }
            while(!key);                          //等待按键松手
         }
     }
}
回复

使用道具 举报

11#
ID:624769 发表于 2021-9-14 23:23 | 只看该作者
qwettyuio 发表于 2021-9-14 15:08
这是51的控制,我也不知道什么原因
#include
unsigned int condition=0;//这里高电平占一份

void Isr01() interrupt 1         //定时器时间到了进入中断服务
{
        TL0 = 0xff;                //设置定时初值
    TH0 = 0xFF;
    cnt++;
}

你这定时器这样设置,连出都出不了中断…… 就死定时器里了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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