- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-09-30 23:00:40
已绑定手机
新手上路
- 积分
- 9
|
我是初学嵌入式,只是学过一点点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;
}
|
|