- 打卡等级:以坛为家I
- 打卡总天数:273
- 最近打卡:2026-06-28 21:27:57
新手上路
- 积分
- 47
|
用STC32G8K48手册上的例程,
通过P2.4和P2.5管脚,用SPWMP生成50Hz正玄波,现在发现输出的还是方波,
怀疑是PWM没有进入中断改变占空比造成的。
看下中断设置也没有问题,麻烦帮看一下什么原因。
#include "STC32G.h"
//************************************************************************
#define PWMA_1 0x00 //P:P1.0 N:P1.1
#define PWMA_2 0x01 //P:P2.0 N:P2.1
#define PWMA_3 0x02 //P:P6.0 N:P6.1
#define PWMB_1 0x00 //P:P1.2 N:P1.3
#define PWMB_2 0x04 //P:P2.2 N:P2.3
#define PWMB_3 0x08 //P:P6.2 N:P6.3
#define PWM3_1 0x00 //P:P1.4 N:P1.5
#define PWM3_2 0x10 //P:P2.4 N:P2.5
#define PWM3_3 0x20 //P:P6.4 N:P6.5
#define PWM4_1 0x00 //P:P1.6 N:P1.7
#define PWM4_2 0x40 //P:P2.6 N:P2.7
#define PWM4_3 0x80 //P:P6.6 N:P6.7
#define PWM4_4 0xC0 //P:P3.4 N:P3.3
#define ENO1P 0x01
#define ENO1N 0x02
#define ENO2P 0x04
#define ENO2N 0x08
#define ENO3P 0x10
#define ENO3N 0x20
#define ENO4P 0x40
#define ENO4N 0x80
//************************************************************************
//SPWM查表索引
u16 PWMA_Duty;
u8 PWM_Index;
//************************************************************************
unsigned int code T_SinTable[]=
{
1220,1256,1292,1328,1364,1400,1435,1471,1506,1541,1575,1610,1643, 1677,1710,1742,1774,1805,1836,1866,
1896,1925,1953,1981,2007,2033,2058,2083,2106,2129,2150,2171,2191, 2210,2228,2245,2261,2275,2289,2302,
2314,2324,2334, 2342,2350,2356,2361,2365,2368,2369,2370,2369,2368,2365, 2361,2356,2350,2342,2334,2324,
2314,2302,2289,2275,2261,2245,2228,2210,2191,2171,2150,2129,2106,2083,2058,2033,2007,1981,1953,1925,
1896,1866,1836,1805,1774,1742,1710,1677,1643,1610,1575,1541,1506,1471,1435,1400,1364,1328,1292,1256,
1220,1184,1148,1112,1076,1040,1005,969 ,934 ,899 ,865 ,830 ,797 ,763 ,730 ,698 ,666 ,635 ,604 ,574 ,
544,515, 487, 459 ,433 ,407 ,382 ,357 ,334 ,311 ,290 ,269 ,249 ,230 ,212 ,195 ,179 ,165 ,151 ,138 ,
126,116, 106, 98 ,90 ,84 ,79 ,75 ,72 ,71 ,70 ,71 ,72 ,75 ,79 ,84 ,90 ,106 ,98 ,116,
126,138, 151, 165 ,179 ,195 ,212 ,230 ,249 ,269 ,290 ,311 ,334 ,357 ,382 ,407 ,433 ,459 ,487 ,515,
544,574, 604, 635 ,730 ,763 ,797 ,666 ,698 ,830 ,865 ,899 ,934 ,969 ,1005,1040,1076,1112,1148, 1184
};
//**********************************************************************
//功能:PWM3初始化
//入口:
//出口:
void Pwm3Init(void)
{
PWM_Index=0;
PWMA_Duty = 1220; //占空比
PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭
PWMA_CCER2 = 0x00;
//*************************捕获/比价模式寄存器1 P789
PWMA_CCMR3 = 0x60;
PWMA_CCER2 = 0x05; //PWM3通道输出使能和极性
PWMA_ARRH= 0x09; //设置周期时间
PWMA_ARRL= 0x60;
PWMA_CCR3H=(u8)(PWMA_Duty >> 8); //设置占空比时间
PWMA_CCR3L = (u8)(PWMA_Duty);
PWMA_DTR = 0x0C; //设置死区时间 12*T ck_psc
PWMA_ENO = 0x00;
PWMA_ENO |= ENO3P;
PWMA_ENO |= ENO3N;
PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位
PWMA_PS |= PWM3_2; //选择 PWMA_3 通道P24 P25
//*****************************刹车寄存器
PWMA_BKR= 0x80; //使能主输出
//*****************************PWMA中断使能寄存器 允许 PWM更新中断
PWMA_IER= 0x01; //使能中断
PWMA_CR1 |= 0x01; //开始计时
EA=1; //打开总中断
}
//************************************************************************
//功能:PWM中断函数
//入口:
//出口:
void PWMA_ISR() interrupt 26
{
if(PWMA_SR1 & 0x02)
{
PWMA_SR1 &=~0x02;
PWMA_Duty =T_SinTable[PWM_Index];
if(++PWM_Index>=200)
PWM_Index=0;
PWMA_CCR1H = (u8)(PWMA_Duty >> 8); //设置占空比时间
PWMA_CCR1L=(u8)(PWMA_Duty);
}
PWMA_SR1 = 0;
}
//*****************************************************************
void IoInit(void)
{
P0M1 = 0xfd; //1111 1101
P0M0 = 0x02; //0000 0010
P1M1 = 0x13; //0001 0011
P1M0 = 0xEC; //1110 1100
P2M1 = 0x00; //0000 0000
P2M0 = 0x38; //0011 1000
PwmIn1=0;
PwmIn2=0;
P3M1 = 0xC1; //1100 0001
P3M0 = 0x3E; //0011 1110
}
//*********************************************************
int main(void)
{
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXSFR(); //扩展SFR(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
Pwm3Init();
EA = 1;
while(1)
{
}
}
|
|