找回密码
 立即注册
查看: 582|回复: 7

用试验箱测试 手册 25.10.6高级PWM输出-硬件可调-脉冲计数(硬件方式)

[复制链接]
  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-09-25 16:13:06

7

主题

6

回帖

149

积分

注册会员

积分
149
发表于 2024-5-7 11:15:35 | 显示全部楼层 |阅读模式
    用试验箱测试 手册 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);
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-7 16:37:43 | 显示全部楼层
本帖最后由 乘风飞扬 于 2024-5-7 16:45 编辑

主要是这个原因吧:
截图202405071635262635.jpg
所以不是第一个没发出去,而是第二个没发出去。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-09-25 16:13:06

7

主题

6

回帖

149

积分

注册会员

积分
149
发表于 2024-5-7 17:05:29 | 显示全部楼层
本帖最后由 liming3267 于 2024-5-7 17:12 编辑
乘风*** 发表于 2024-5-7 16:37
主要是这个原因吧:

所以不是第一个没发出去,而是第二个没发出去。

但是REP_CNT上电是0啊,不能装载吗?那么我应该怎样出来才能让它触发装载呢?我单独发一个也是不行的,也就是我只调用一次函数是无法发送出来脉冲的。
截图202405071711119058.jpg 这里单独发送第一个和第二个是无法产生脉冲的。而且发送两次中间的延时也是必不可少的。不加延时连续发两次也是无法发出脉冲的。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-7 18:03:34 | 显示全部楼层
在最后一串脉冲发送后面再触发一次就可以,延时是等待脉冲发送完成:
        TxPulse(100);                                            //这里发送的第一次没有接收到脉冲
        delay_ms(1);                                               //延时
        TxPulse(100);                                           //如果上面的两个代码都在则可以收到这次发送的100个脉冲信号
        delay_ms(1);                                               //延时
        PWMA_CR1 |= 0x89;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-09-25 16:13:06

7

主题

6

回帖

149

积分

注册会员

积分
149
发表于 2024-5-7 18:10:52 | 显示全部楼层
本帖最后由 liming3267 于 2024-5-7 18:17 编辑
乘风*** 发表于 2024-5-7 18:03
在最后一串脉冲发送后面再触发一次就可以,延时是等待脉冲发送完成:
        TxPulse(100);               ...

如果我只想上电发送一次脉冲该如何处理?


TxPulse(100);                                            //这里发送的第一次没有接收到脉冲
delay_ms(1);  

while(1);

这样处理可以吗?但是这样写实际测试是发不出来脉冲的。
截图202405071812375157.jpg 这里已经带了触发的指令。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-7 18:46:11 | 显示全部楼层
limin*** 发表于 2024-5-7 18:10
如果我只想上电发送一次脉冲该如何处理?

        TxPulse(100);                                           //如果上面的两个代码都在则可以收到这次发送的100个脉冲信号
        delay_ms(1);                                               //延时
        PWMA_CR1 |= 0x89;
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:22
  • 最近打卡:2024-09-25 16:13:06

7

主题

6

回帖

149

积分

注册会员

积分
149
发表于 2024-5-7 19:06:24 | 显示全部楼层
本帖最后由 liming3267 于 2024-5-7 19:46 编辑
乘风*** 发表于 2024-5-7 18:46
TxPulse(100);                                           //如果上面的两个代码都在则可以收到 ...

按您说的这样,确实可以实现发送一次。

它实际相当于:

        PWMA_RCR = 100;                                                                                //重复计数寄存器,计数rep个脉冲后更新使事件
        PWMA_CR1 |= 0x89;                                                                          //使能ARR预装载,单脉冲模式,开始计时        
        delay_ms(1);
        PWMA_CR1 |= 0x89;                //还是不太明白为什么要连续发送两次"PWMA_CR1 |= 0x89; " 第一次的”PWMA_CR1 |= 0x89; “为什么不能执行?
                                                      //而且中间还必须加上延时

另外我又测试了下面的程序:

        PWMA_RCR = 10;                                                                                //重复计数寄存器,计数rep个脉冲后更新使事件
        PWMA_CR1 |= 0x89;                                                                          //使能ARR预装载,单脉冲模式,开始计时        
        delay_ms(1);
        PWMA_RCR = 100;
        PWMA_CR1 |= 0x89;
   这个程序每次走的是10个脉冲,而不是100个脉冲。您上面说的第一点是对的。

截图202405071946158619.jpg 但是为什么第一次的触发无法触发开始。      




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-5-8 09:01:01 | 显示全部楼层
limin*** 发表于 2024-5-7 19:06
按您说的这样,确实可以实现发送一次。

它实际相当于:

你再仔细看看我在2楼发的图片里面红线框出来的部分。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:00 , Processed in 0.159404 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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