找回密码
 立即注册
查看: 753|回复: 5

STC8H1K08使用PWM输出38K,无波形输出。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-09-24 09:38:07

7

主题

16

回帖

109

积分

注册会员

积分
109
发表于 2024-5-20 17:19:50 | 显示全部楼层 |阅读模式
我这边只有STC8H1K08的芯片,我想使用p3.3输出38k的波形,做红外发射。
下面是基于示例代码做的修改,p3.3发现无波形输出。
帮忙看看问题在哪里?

/* --- Web: www.STCAI.com ---------------------------------------------*/
/* --- BBS: www.STCAIMCU.com  -----------------------------------------*/

/* Èç¹ûÒªÔÚ³ÌÐòÖÐʹÓô˴úÂë,ÇëÔÚ³ÌÐòÖÐ×¢Ã÷ʹÓÃÁËSTCµÄ×ÊÁϼ°³ÌÐò        */
/*---------------------------------------------------------------------*/


/*************  ±¾³ÌÐò¹¦ÄÜ˵Ã÷  **************

±¾Àý³Ì»ùÓÚSTC8H8K64UΪÖ÷¿ØÐ¾Æ¬µÄʵÑéÏä8½øÐбàд²âÊÔ£¬STC8HϵÁÐоƬ¿ÉͨÓòο¼.

Óû§¿ÉÒÔÔں궨ÒåÖиıäMCUÖ÷ʱÖÓÆµÂÊ. ·¶Î§ 8MHZ ~ 33MHZ.

ºìÍâ·¢Éä³ÌÐò¡£Ä£ÄâÊг¡ÉÏÓÃÁ¿×î´óµÄNECµÄ±àÂë¡£

Óû§¿ÉÒÔÔں궨ÒåÖÐÖ¸¶¨Óû§Âë.

ʹÓÃPWM4²úÉú38KHZÔØ²¨, 1/3Õ¼¿Õ±È, ÿ¸ö38KHZÖÜÆÚ·¢Éä¹Ü·¢Éä9us,¹Ø±Õ16.3us.

ʹÓÿª·¢°åÉϵÄ16¸öIOɨÃè°´¼ü, MCU²»Ë¯Ãß, Á¬ÐøÉ¨Ãè°´¼ü.

µ±¼ü°´ÏÂ, µÚһ֡ΪÊý¾Ý, ºóÃæµÄÖ¡ÎªÖØ¸´Ö¡,²»´øÊý¾Ý, ¾ßÌ嶨ÒåÇë×ÔÐвο¼NECµÄ±àÂë×ÊÁÏ.

¼üÊͷźó, Í£Ö¹·¢ËÍ.

ÏÂÔØÊ±, Ñ¡ÔñʱÖÓ 24MHZ (Óû§¿É×ÔÐÐÐÞ¸ÄÆµÂÊ).

******************************************/

#include "stc8h.h"       //°üº¬´ËÍ·Îļþºó£¬²»ÐèÒªÔÙ°üº¬"reg51.h"Í·Îļþ
#include "intrins.h"

#define     MAIN_Fosc       24000000UL  //¶¨ÒåÖ÷ʱÖÓ

typedef     unsigned char   u8;
typedef     unsigned int    u16;
typedef     unsigned long   u32;

/*************  ºìÍâ·¢ËÍÏà¹Ø±äÁ¿    **************/
#define User_code   0xFF00      //¶¨ÒåºìÍâÓû§Âë

sbit    P_IR_TX   = P3^3;   //¶¨ÒåºìÍâ·¢ËͶ˿Ú
#define IR_TX_ON    0
#define IR_TX_OFF   1

u16     tx_cnt;     //·¢ËÍ»ò¿ÕÏеÄÂö³å¼ÆÊý(µÈÓÚ38KHZµÄÂö³åÊý£¬¶ÔӦʱ¼ä), ºìÍâÆµÂÊΪ38KHZ, ÖÜÆÚ26.3us
u8      TxTime;     //·¢ËÍʱ¼ä

u16   send_time_num = 0;

u8  KeyHoldCnt; //¼ü°´Ï¼ÆÊ±
u8  KeyCode;    //¸øÓû§Ê¹ÓõļüÂë, 1~16ÓÐЧ

/*************  ±¾µØº¯ÊýÉùÃ÷    **************/
void    delay_ms(u8 ms);
void    PWM_config(void);
void    IR_TxPulse(u16 pulse);
void    IR_TxSpace(u16 pulse);
void    IR_TxByte(u8 dat);

/********************** Ö÷º¯Êý ************************/
void main(void)
{
    P_SW2 |= 0x80;  //À©Õ¹¼Ä´æÆ÷(XFR)·ÃÎÊʹÄÜ
#if 0
    P1M1 = 0x30;   P1M0 = 0x30;   //ÉèÖÃP1.4¡¢P1.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P2M1 = 0x3c;   P2M0 = 0x3c;   //ÉèÖÃP2.2~P2.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P3M1 = 0x50;   P3M0 = 0x50;   //ÉèÖÃP3.4¡¢P3.6Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P4M1 = 0x3c;   P4M0 = 0x3c;   //ÉèÖÃP4.2~P4.5Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P5M1 = 0x0c;   P5M0 = 0x0c;   //ÉèÖÃP5.2¡¢P5.3Ϊ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P6M1 = 0xff;   P6M0 = 0xff;   //ÉèÖÃΪ©¼«¿ªÂ·(ʵÑéÏä¼ÓÁËÉÏÀ­µç×èµ½3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //ÉèÖÃΪ׼˫Ïò¿Ú
#endif
        
    PWM_config();
    P_IR_TX = IR_TX_OFF;

    EA = 1;                     //´ò¿ª×ÜÖжÏ

    while(1)
    {
        delay_ms(60);       //30ms
                                send_time_num++;
                        
        if(send_time_num == 200)        //¼ì²âµ½¼üÂë
        {
                                                send_time_num = 0;
            TxTime = 0;
                                //Ò»Ö¡Êý¾Ý×îС³¤¶È = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
                                //Ò»Ö¡Êý¾Ý×î´ó³¤¶È = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
            IR_TxPulse(342);    //¶ÔÓ¦9ms£¬Í¬²½Í·       9ms
            IR_TxSpace(171);    //¶ÔÓ¦4.5ms£¬Í¬²½Í·¼ä¸ô 4.5ms
            IR_TxPulse(21);     //¿ªÊ¼·¢ËÍÊý¾Ý          0.5625ms

            IR_TxByte(User_code%256);   //·¢Óû§ÂëµÍ×Ö½Ú
            IR_TxByte(User_code/256);   //·¢Óû§Âë¸ß×Ö½Ú
            IR_TxByte(KeyCode);         //·¢Êý¾Ý
            IR_TxByte(~KeyCode);        //·¢Êý¾Ý·´Âë

            if(TxTime < 56)     //Ò»Ö¡°´×î´ó77ms·¢ËÍ, ²»¹»µÄ»°,²¹³¥Ê±¼ä     108ms
            {
                TxTime = 56 - TxTime;
                TxTime = TxTime + TxTime / 8;
                delay_ms(TxTime);
            }
            delay_ms(31);
        }
    }
}
/**********************************************/

//========================================================================
// º¯Êý: void delay_ms(u8 ms)
// ÃèÊö: ÑÓʱº¯Êý¡£
// ²ÎÊý: ms,ÒªÑÓʱµÄmsÊý, ÕâÀïÖ»Ö§³Ö1~255ms. ×Ô¶¯ÊÊÓ¦Ö÷ʱÖÓ.
// ·µ»Ø: none.
// °æ±¾: VER1.0
// ÈÕÆÚ: 2021-3-9
// ±¸×¢:
//========================================================================
void delay_ms(u8 ms)
{
     u16 i;
     do{
          i = MAIN_Fosc / 10000;
          while(--i);   //10T per loop
     }while(--ms);
}



/************* ·¢ËÍÂö³åº¯Êý **************/
void IR_TxPulse(u16 pulse)
{
    tx_cnt = pulse;
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x68; //ÉèÖà PWM4 ģʽ1 Êä³ö
    PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
    PWMA_IER = 0x10;   //ʹÄܲ¶»ñ/±È½Ï 4 ÖжÏ
    while(tx_cnt);
}

/************* ·¢ËÍ¿ÕÏк¯Êý **************/
void IR_TxSpace(u16 pulse)
{
    tx_cnt = pulse;
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x40; //ÉèÖà PWM4 Ç¿ÖÆÎªÎÞЧµçƽ
    PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
    PWMA_IER = 0x10;   //ʹÄܲ¶»ñ/±È½Ï 4 ÖжÏ
    while(tx_cnt);
}


/************* ·¢ËÍÒ»¸ö×Ö½Úº¯Êý **************/
void IR_TxByte(u8 dat)
{
    u8 i;
    for(i=0; i<8; i++)
    {
        if(dat & 1)     IR_TxSpace(63), TxTime += 2;    //Êý¾Ý1¶ÔÓ¦ 1.6875 + 0.5625 ms
        else            IR_TxSpace(21), TxTime++;       //Êý¾Ý0¶ÔÓ¦ 0.5625 + 0.5625 ms
        IR_TxPulse(21);         //Âö³å¶¼ÊÇ0.5625ms
        dat >>= 1;              //ÏÂÒ»¸öλ
    }
}

//========================================================================
// º¯Êý: void PWM_config(void)
// ÃèÊö: PCAÅäÖú¯Êý.
// ²ÎÊý: None
// ·µ»Ø: none.
// °æ±¾: V1.0, 2012-11-22
//========================================================================
void PWM_config(void)
{
    PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
    PWMA_CCMR4 = 0x68; //ÉèÖà PWM4 ģʽ1 Êä³ö
    //PWMA_CCER2 = 0xB0; //ʹÄÜ CC4E ͨµÀ, µÍµçƽÓÐЧ

    PWMA_ARRH = 0x02; //ÉèÖÃÖÜÆÚʱ¼ä
    PWMA_ARRL = 0x77;
    PWMA_CCR4H = 0;
    PWMA_CCR4L = 210; //ÉèÖÃÕ¼¿Õ±Èʱ¼ä

    PWMA_PS = 0x40;  //¸ß¼¶ PWM ͨµÀ 4N Êä³ö½ÅÑ¡Ôñλ, 0x00:P1.7, 0x40:P2.7, 0x80:P6.7, 0xC0:P3.3
//  PWMA_PS = 0x40;  //¸ß¼¶ PWM ͨµÀ 4P Êä³ö½ÅÑ¡Ôñλ, 0x00:P1.6, 0x40:P2.6, 0x80:P6.6, 0xC0:P3.4
    PWMA_ENO = 0x80; //ʹÄÜ PWM4N Êä³ö
//  PWMA_ENO = 0x40; //ʹÄÜ PWM4P Êä³ö
    PWMA_BKR = 0x80; //ʹÄÜÖ÷Êä³ö
//    PWMA_IER = 0x10; // ʹÄÜÖжÏ
    PWMA_CR1 |= 0x01; //¿ªÊ¼¼ÆÊ±
}

/******************* PWMÖжϺ¯Êý ********************/
void PWMA_ISR() interrupt 26
{
    if(PWMA_SR1 & 0X10)
    {
        //PWMA_SR1 &=~0X10;
        PWMA_SR1 = 0;
                        
        if(--tx_cnt == 0)
        {
            PWMA_CCER2 = 0x00; //д CCMRx ǰ±ØÐëÏÈÇåÁã CCxE ¹Ø±ÕͨµÀ
            PWMA_CCMR4 = 0x40; //ÉèÖà PWM4 Ç¿ÖÆÎªÎÞЧµçƽ
            PWMA_CCER2 = 0x70; //ʹÄÜ CC4NE ͨµÀ, µÍµçƽÓÐЧ
            PWMA_IER = 0x00;   // ¹Ø±ÕÖжÏ
        }
    }
}


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-5-20 17:24:29 | 显示全部楼层


管脚图
截图202405201723016722.jpg

截图202405201724016648.jpg

截图202405201724261576.jpg

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2024-5-20 17:28:24 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-5-20 17:28:42 | 显示全部楼层
请先测试STC官方例程,确认PWM输出正常,再移植修改。红外遥控是简单代码,很容易实现的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2024-09-24 09:38:07

7

主题

16

回帖

109

积分

注册会员

积分
109
发表于 2024-5-20 17:43:48 | 显示全部楼层
官方例程是基于STC8H8K64U芯片的,我这边没有这颗芯片。我这边只有STC8H1K08的芯片,所以要移植了验证。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-20 18:50:51 | 显示全部楼层
既然使用P33输出PWM,那么PWM4N通道切换就要设置到P33
截图202405201849535653.jpg
截图202405201850498863.jpg
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 12:48 , Processed in 0.122248 second(s), 79 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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