找回密码
 立即注册
查看: 53|回复: 1

AI8051U生成单极性SPWM波的疑问

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-30 23:00:40
已绑定手机

1

主题

0

回帖

9

积分

新手上路

积分
9
发表于 2025-9-30 23:00:40 | 显示全部楼层 |阅读模式
我是初学嵌入式,只是学过一点点C,现在想学点单片机程序,在此感谢各位大佬能看到我的发的疑问,希望能得到各位大佬能够帮忙解答疑惑。
我在手册上看到的代码,然后照写下来后编译成功烧录后单片机没有任何PWM波输出,我想写一个单极性的spwm正弦波脉宽调制程序,如果大佬有相关的程序可以参考帮忙告知一二,在下感激不尽。



#include "config.h"                     //默认已包含stdio.h、intrins.h、ai_usb.h等头文件
#include "AI8051U.h"
#include "intrins.h"
#include "stdio.h"
#include "ai_usb.h"
#include "def.h"

//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
#define PWMA_1 0x00
#define PWMA_2 0x01
#define PWMA_3 0x02

#define PWMB_1 0x00
#define PWMB_2 0x04
#define PWMB_3 0x08

#define PWM3_1 0x00
#define PWM3_2 0x10
#define PWM3_3 0x20

#define PWM4_1 0x00
#define PWM4_2 0x40
#define PWM4_3 0x80
#define PWM4_4 0xC0

#define ENO1P 0x01
#define ENO1N 0x02
#define ENO2P 0x04
#define ENO2N 0x08
#define ENO3P 0x10
#define ENO3N 0x20
#define ENO4P 0x40
#define ENO4N 0x80


/*******************************************声明变量*****************************************************/

u16 PWMA_Duty=1220;
u8 PWMA_Index;

unsigned int code T_SinTable[]={
        0x0,0x7,0xF,0x16,0x1D,0x25,0x2C,0x33,0x3A,0x41,0x48,0x4F,
        0x56,0x5C,0x63,0x6A,0x70,0x76,0x7D,0x83,0x89,0x8E,0x94,
        0x9A,0x9F,0xA4,0xA9,0xAE,0xB3,0xB7,0xBC,0xC0,0xC4,0xC7,
        0xCB,0xCE,0xD1,0xD4,0xD7,0xD9,0xDC,0xDE,0xE0,0xE1,0xE3,
        0xE4,0xE5,0xE5,0xE6,0xE6,
0xE6,0xE6,0xE5,0xE5,0xE4,0xE3,0xE1,0xE0,0xDE,0xDC,0xD9,
        0xD7,0xD4,0xD1,0xCE,0xCB,0xC7,0xC4,0xC0,0xBC,0xB7,0xB3,
        0xAE,0xA9,0xA4,0x9F,0x9A,0x94,0x8E,0x89,0x83,0x7D,0x76,
0x70,0x6A,0x63,0x5C,0x56,0x4F,0x48,0x41,0x3A,0x33,0x2C,0x25,
0x1D,0x16,0xF,0x7,0x0};


//<<AICUBE_USER_GLOBAL_DEFINE_END>>

void SYS_Init(void)
{
    EAXFR=1;                  //使能访问扩展XFR
    WTST=0;                //设置最快速度访问程序代码
    CKCON=0;               //设置最快速度访问内部XDATA
    //IAP_SetTimeBase();                  //设置IAP等待参数,产生1us时基

    P0M0 |= 0x0f; P0M1 &= ~0x0f;        //初始化P0口为推挽模式
//    P1M0 = 0x00; P1M1 = 0x00;           //初始化P1口为准双向口模式
//    P2M0 = 0x00; P2M1 = 0x00;           //初始化P2口为准双向口模式
//    P3M0 = 0x00; P3M1 = 0x00;           //初始化P3口为准双向口模式
//    P4M0 = 0x00; P4M1 = 0x00;           //初始化P4口为准双向口模式
//    P5M0 = 0x00; P5M1 = 0x00;           //初始化P5口为准双向口模式
//    P6M0 = 0x00; P6M1 = 0x00;           //初始化P6口为准双向口模式
//    P7M0 = 0x00; P7M1 = 0x00;           //初始化P7口为准双向口模式

          



    CLK_Init();                         //时钟模块初始化
    TIMER0_Init();                      //定时器0初始化
    TIMER1_Init();                      //定时器1初始化
    USBLIB_Init();                      //USB库初始化
    MATHLIB_Init();                     //MATH库初始化
                IAP_TPS=40;

    EnableGlobalInt();                  //使能全局中断
}


void main(void)
{

    SYS_Init();
                       
//                PWMA_Duty=1220;
       
                PWMA_CCER1=0x00;//CCER1清零CCxE关闭通道
                PWMA_CCER2=0x00;//
                PWMA_CCMR1=0x60;//通道模式配置
//        PWMA_CCMR2=0x60;
//        PWMA_CCMR3=0x60;
//        PWMA_CCMR4=0x60;
                PWMA_CCER1=0x05;//配置通道输出使能和极性
        //PWMA_CCER2=0x55;
       
        /*******************设置周期时间***************/
                PWMA_ARRH=0x09;
                PWMA_ARRL=0x06;
        /*********************************************/       
       
        /*******************设置占空比时间************/
                PWMA_CCR1H=(u8)(PWMA_Duty>>8);
                PWMA_CCR1L=(u8)(PWMA_Duty);
        /*******************************************/

       
        /*******************设置死区时间************/
                PWMA_DTR=0X0C;
        /*******************************************/
               
        /*******************使能输出************/
               
                PWMA_ENO=0X00;
                PWMA_ENO|=ENO1P;
                PWMA_ENO|=ENO1N;
                PWMA_ENO|=ENO2P;
                PWMA_ENO|=ENO2N;
//                PWMA_ENO&=ENO3P;
//                PWMA_ENO&=ENO3N;
//                PWMA_ENO&=ENO4P;
//                PWMA_ENO&=ENO4N;
               
        /*******************************************/       
               
                PWMA_PS=0X00;    //高级PWM通道输出脚选择位
                PWMA_PS|=PWMA_3;//选择PWMA_3通道
//                PWMA_PS&=PWMB_3;
//                PWMA_PS&=PWM3_3;
//                PWMA_PS&=PWM4_3;

                PWMA_BKR=0X80;//使能输出
                PWMA_IER=0X01;//使能中断
                PWMA_CR1&=0X01;//开始计时
               
                EA=1;                                                //打开总中断
       
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
        USBLIB_OUT_Done();              //查询方式处理USB接收的数据
               

        //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
        // 在此添加主函数中用户主循环代码  
        //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}


/**********************************中断服务函数**************************************************/
void PWMA_ISR() interrupt 26
{
        if(PWMA_SR1&0X01)
        {
                PWMA_SR1 &=~0X01;
                PWMA_Duty=T_SinTable[PWMA_Index];
                if(++PWMA_Index>=200)
                        PWMA_Index=0;
                PWMA_CCR1H=(u8)(PWMA_Duty>>8);
                PWMA_CCR1L=(u8)(PWMA_Duty);
        }
        PWMA_SR1=0;
}


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:208
  • 最近打卡:2025-10-15 11:03:15

787

主题

1万

回帖

1万

积分

管理员

积分
19770
发表于 2025-10-4 22:14:08 | 显示全部楼层
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-10-16 05:35 , Processed in 0.112379 second(s), 55 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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