- 打卡等级:偶尔看看II
- 打卡总天数:22
- 最近打卡:2024-09-25 16:13:06
注册会员
- 积分
- 149
|
用试验箱测试 手册 25.10.6高级PWM输出-硬件可调-脉冲计数(硬件方式)的时候发现上电调用 “TxPulse()"的时候第一次无法发出脉冲信号,
必须第一次调用 “TxPulse(100)"后再延时一段时间再调用“TxPulse(100)"以后都能正常发送脉冲。修改的例子程序如下:
#include "../comm/STC32G.h"
#include "stdio.h"
#include "intrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
#define MAIN_Fosc 24000000L
//==================================================================================
//-------------------------用户宏定义-------------------------------
#define Timer0_Reload (65536UL-(MAIN_Fosc/1000)) //Timer0 中断频率1000次/秒
//#define PWM1_0 0x00 //P:P1.0 N:P1.1
//#define PWM1_1 0x01 //P:P2.0 N:P2.1
#define PWM1_2 0x02 //P:P6.0 N:P6.1
//#define PWM2_0 0x00 //P:P1.2/P5.4 N:P1.3
//#define PWM2_1 0x01 //P:P2.2 N:P2.3
//#define PWM2_2 0x02 //P:P6.2 N:P6.3
//#define PWM3_0 0x00 //P:P1.4 N:P1.5
//#define PWM3_1 0x01 //P:P2.4 N:P2.5
//#define PWM3_2 0x02 //P:P6.4 N:P6.5
//#define PWM4_0 0x00 //P:P1.6 N:P1.7
//#define PWM4_1 0x01 //P:P2.6 N:P2.7
//#define PWM4_2 0x02 //P:P6.6 N:P6.7
#define ENO1P 0x01
//#define ENO1N 0x02
//#define ENO2P 0x04
//#define ENO2N 0x08
//#define ENO3P 0x10
//#define ENO3N 0x20
//#define ENO4P 0x40
//#define ENO4N 0x80
//-----------------------------------------------------------------------------
//---------------------本地声明-------------------
bit B_1ms;
bit PWM1_Flag;
u16 Period;
u8 msSecond;
u8 inc1=0;
void UpdatePwm(void);
void TxPulse(u8 rep);
void delay_ms(u16 ms);
//-----------------------------主函数--------------------------------------------
void main(void)
{
//设置程序指令延时参数
WTST = 0; //赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1;
CKCON = 0; //提高访问XRAM速度
// P0M1 = 0x00; P0M0 = 0x00; //设置为双向口
// P1M1 = 0x00; P1M0 = 0x00;
// P2M1 = 0x00; P2M0 = 0x00;
// P3M1 = 0x00; P3M0 = 0x00;
P4M1 = 0x00; P4M0 = 0x00;
// P5M1 = 0x00; P5M0 = 0x00;
P6M1 = 0x00; P6M0 = 0xff;
// P7M1 = 0x00; P7M0 = 0x00;
//P40 = 0;
PWM1_Flag = 0; //判断周期递增递、减标志
Period = 0x1000;
//Period = 0x500; //PWM周期,减小加快速度。
//Timer0初始化
// AUXR = 0x80; //Timer0 set as 1T,bits timer auto-reload 手册 449页
//
// TH0=(u8)(Timer0_Reload/256); //手册449页 计算定时器定时值重装值
// TL0=(u8)(Timer0_Reload%256);
//
// ET0=1; //Timer0 interrupt enable 手册384页
// TR0=1; //Timer0 run 手册440页
PWMA_ENO = 0x00; //使能前先关闭
PWMA_ENO |=ENO1P; //使能输出 手册738页
PWMA_CCER1 = 0x00; //写CCMRx前必须先清零 CCxE关闭通道
PWMA_CCMR1 = 0x68; //设置PWM模式1输出 手册751页 预装方式不立即更新
//PWMA_CCER1 = 0x01; //使能CC1E通道,高电平有效
PWMA_CCER1 = 0x03; //使能CC1E通道,低电平有效 手册760页 打开比较匹配使能
PWMA_PS = 0X00; //高级PWM通道输出脚选择位=0
PWMA_PS |= PWM1_2; //选择PWM1_2通道 P:P6.0 N:P6.1 手册736页 pwm输出IO口通道选择
UpdatePwm(); // 设置频率,设置占空比
PWMA_BKR = 0x80; //使能主输出 手册764页 打开刹车寄存器允许PWM输出正、负
//PWMA_CR1 |= 0x89; //使能ARR预装载,单脉冲模式,开始计时
P40 = 0; //给LED供电
//EA = 1; //打开总中断 这里不使用中断
TxPulse(100); //这里发送的第一次没有接收到脉冲
delay_ms(1); //这里的延时必须加上不然第二次送的脉冲也无法生成
TxPulse(100); //如果上面的两个代码都在则可以收到这次发送的100个脉冲信号
while(1)
{
//TxPulse(200);
delay_ms(100);
}
}
//---------------发送脉冲函数--------------------------------
void TxPulse(u8 rep)
{
if(rep==0) return;
rep-=1;
PWMA_RCR = rep; //重复计数寄存器,计数rep个脉冲后更新使事件
PWMA_CR1 |= 0x89; //使能ARR预装载,单脉冲模式,开始计时
}
//----------------Timer0 1ms 中断函数-----------------------------------------
/*
void timer0(void) interrupt 1
{
B_1ms = 1;
if(PWM1_Flag)
{
Period++; //周期递增
if(Period>=0x1000) PWM1_Flag = 0;
}
else
{
Period--; //周期递减
if(Period<=0x0100) PWM1_Flag = 1;
}
UpdatePwm();
}
*/
//----------------------跟新PMW周期占空比-------------------------------
void UpdatePwm(void)
{
PWMA_ARRH = (u8)(Period>>8); //设置周期时间
PWMA_ARRL = (u8)Period;
PWMA_CCR1H = (u8)((Period>>1)>>8); //设置占空比使劲按:Period/2
PWMA_CCR1L = (u8)((Period>>1));
}
//========================================================================
// 函数: void delay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注:
//========================================================================
void delay_ms(u16 ms)
{
u16 i;
do{
i = MAIN_Fosc / 6000;
while(--i);
}while(--ms);
}
|
|