- 打卡等级:偶尔看看I
- 打卡总天数:15
- 最近打卡:2026-03-02 20:13:14
注册会员
- 积分
- 146
|
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Demo --------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.stcai.com ------------------------------------------*/
/* --- BBS: www.stcaimcu.com ---------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#define MAIN_Fosc 12000000L //定义主时钟
#include "STC32G.h"
sbit start=P0^3;
sbit stop =P0^2;
sbit add =P3^5;
sbit sub =P3^4;
#define PWMA_DUTY 1000 //周期
u16 PWMA_PHASE1=100; //通道1相位差 500 180度
u16 PWMA_PHASE2=100; //通道2相位差 500 180度
u16 pwma1; //PWMA1输出高电平时间
u16 pwma2; //PWMA2输出高电平时间
bit B_OutState,B_OutState2; //中断使用, 用户层不可见.
u8 con;
void PWMA_config(void);
void delay(u16 i)
{
u16 j ,k;
for(j=0;j<i;j++)
for(k=0;k<500;k++);
}
/******************** 主函数 **************************/
void main(void)
{ EAXFR = 1; //扩展寄存器(XFR)访问使能
WTST = 0;
CKCON = 0;
P_SW2 |= 0x80; //SFR enable
P2=0x00;
pwma1 = 200; //通道1占空比
pwma2 = 200; //通道2占空比
PWMA_PHASE2=1;
PWMA_config();
EA = 1;
// IP=0x80;
// IPH=0x80;
while (1)
{
if(add==0){while(add==0);if(PWMA_PHASE2<500) PWMA_PHASE2+=1;}
if(sub==0){while(sub==0);if(PWMA_PHASE2>=2) PWMA_PHASE2-=1;}
}
}
//========================================================================
// 函数: void PWMA_config(void)
// 描述: PWM配置函数。
// 参数: noe.
// 返回: none.
// 版本: V1.0, 2022-3-15
// 备注:
//========================================================================
void PWMA_config(void)
{
P_SW2 |= 0x80; //SFR enable
PWMA_ENO = 0; // IO输出禁止
PWMA_IER = 0; // 禁止中断
PWMA_SR1 = 0; // 清除状态
PWMA_SR2 = 0; // 清除状态
PWMA_CR1 = 0; // 清除控制寄存器
PWMA_CR2 = 0; // 清除控制寄存器
PWMA_PSCRH = 0; // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
PWMA_PSCRL = 1; // 预分频, PWM时钟 = 24MHz/(2+1)=8MHz
PWMA_DTR = 12; // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
// 0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
PWMA_ARRH = (PWMA_DUTY-1)/256; // 自动重装载寄存器, 控制PWM周期
PWMA_ARRL = (PWMA_DUTY-1)%256;
PWMA_CCMR1 = 0x68; // 强制输出低
PWMA_CCR1H = pwma1/256; // 比较值, 控制占空比(高电平时钟数)
PWMA_CCR1L = pwma1%256;
PWMA_CCMR2 = 0x40; // 强制输出低
PWMA_CCR2H = PWMA_PHASE2/256; // 匹配值
PWMA_CCR2L = PWMA_PHASE2%256;
PWMA_CCER1 = 0x55; // 捕获/比较使能寄存器1
PWMA_CCER2 = 0x00; // 捕获/比较使能寄存器2
PWMA_PS = 0x05; // 选择IO
PWMA_IER = 0x05; // 设置允许通道1~4中断处理
PWMA_BKR = 0x80; // 主输出使能 相当于总开关
PWMA_CR1 = 0x81; // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数, bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMA_EGR = 0x01; //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
PWMA_ENO = 0x0F; // 允许IO输出
}
//========================================================================
// 函数: void PWMA_ISR(void) interrupt PWMA_VECTOR
// 描述: PWMA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2021-6-1
//========================================================================
void PWMA_ISR(void) interrupt 26
{if(PWMA_SR1 & 0x01) //更新中断标志
{
PWMA_CCR2H = PWMA_PHASE2/256; // 通道2匹配值
PWMA_CCR2L = PWMA_PHASE2%256;
B_OutState = 0;
}
if(PWMA_SR1 & 0x04) //通道2匹配中断标志
{
if(!B_OutState)
{
B_OutState = 1;
PWMA_CCMR2 = 0x50; // 通道模式配置, 强制为有效电平
PWMA_CCR2H = (PWMA_PHASE2+pwma2)/256; // 通道2匹配值
PWMA_CCR2L = (PWMA_PHASE2+pwma2)%256;
PWMA_CCMR2 = 0x60; // 通道模式配置, PWM模式1, 匹配时输出低电平
}
else PWMA_CCMR2 = 0x40; // 通道模式配置, 强制为无效电平
}
PWMA_SR1 = 0; //清除中断标志
PWMA_SR2 = 0; //清除中断标志
}
这是参考提供的程序修改的(想用软件的方式产生移相波形),通道1产生一个占空比为20%的波形,通道2也是产生人个占空比为20%的波形,通道2的相位差PWMA_PHASE2<20时,波形异常,>20时波形是正常的。请问下大家有没有碰到这个问题?
|
-
|