找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 97|回复: 1
打印 上一主题 下一主题
收起左侧

PWM逻辑不对,输出抽搐

[复制链接]
跳转到指定楼层
楼主
u8 xdata RF_Energy = 1;                        //强度
bit start_RF = 0;                        //开关


u8 power_Delay_flag =0;
u16 power_Delay_con=0;
u8 xdata CET_MIN= 0;                                                                                                //强度
u8 xdata CET_MAX= 0;                                                                                                //强度

u16 code CET_MIN_Energy_0[21]=  {0,176,192,208,224,240,256,272,288,304,320,336,352,368,384,400,416,432,448,464,480};                                                                                                  //RF强度
u16 code CET_MAX_Energy_100[21]={0,512,528,544,560,576,592,608,624,640,656,672,688,704,720,736,752,768,784,800,816};
u16 PWM_DUTY_CCR4 =0;
u16 PWM_DUTY_CCR4_temp =0;



#define PWM_PSC                         (24-1)        //12分频,0.5us  1M   0-65536从0开始计算 0不分频,1:2分频 fck_cnt=fck_psc/(PSCR[15:0]+1  输出频率=时钟/分频 从0开始
#define PWM_PERIOD                 999                        //周期100us                         FS/(PSC +1/PWMA_ARR+1)
#define PWM_DUTY                         0                        //占空10us               

void PWMA_ADJ_Config()                                //ADJ可调
{

        PWMA_PS =  0x40;                                   //2.7 4n
        PWMA_PSCRH = (u16)(PWM_PSC >> 8);
        PWMA_PSCRL = (u16)(PWM_PSC);                 
        
        PWMA_CCER2 = 0x00; // 写 CCMRx 前必须先清零 CCERx 关闭通道
        PWMA_CCMR4 = 0x60; // 设置 CC2 为 PWMA 输出模式,PWM模式1
        PWMA_CCER2 = 0x40; // 使能 CC4n


        
        PWMA_CCR4H = (u16)(PWM_DUTY >> 8);  //设置占空比
        PWMA_CCR4L = (u16)(PWM_DUTY);
        
        PWMA_ARRH = (u16)(PWM_PERIOD >> 8); // 设置PWM周期
        PWMA_ARRL = (u16)(PWM_PERIOD);
        
        
        PWMA_ENO = 0x80; // 使能 PWM4n 端口输出
        //PWMA_BKR = 0x80; // 使能主输出
        //PWMA_CR1 = 0x01; // 启动PWM定时器
}
void  TM26_Isr() interrupt 26                         //PWMa更新中断
{

    if(PWMA_SR1 & 0x01)
    {

      PWMA_SR1 &= ~0x01;

      PWMA_BKR &= ~0x80; // 使能主输出
    PWMA_CR1 &= ~0x01; // 关闭PWM定时器

    }
}
void power_Delay()   //T0调用 1MS
{

      if(power_Delay_flag ==1 && ++power_Delay_con>=1000 )//PWM 停止一秒
      {
          power_Delay_con=0;
          power_Delay_flag =2;

      }
     else if(power_Delay_flag ==2 && ++power_Delay_con>=200)// 每200MS 加8us
      {     
            power_Delay_con=0;
            PWM_DUTY_CCR4_temp += 8;
            if(PWM_DUTY_CCR4_temp >=PWM_DUTY_CCR4 )
            {
                PWM_DUTY_CCR4_temp =0;
                power_Delay_flag =0;
                PWMA_CCR4H =(u16)(PWM_DUTY_CCR4 >> 8);
                PWMA_CCR4L =(u16)(PWM_DUTY_CCR4);

                return ;

            }
            else   //保险一点吧
            {

              PWMA_CCR4H =(u16)(PWM_DUTY_CCR4_temp >> 8);
              PWMA_CCR4L =(u16)(PWM_DUTY_CCR4_temp);
              PWMA_BKR = 0x80; // 使能主输出
              PWMA_CR1 = 0x01; // PWM定时器
            }

      }
}
void RF_Intensity_add()                                                //强度加  串口接收操作,放在while(1)
{
                        
                if(RF_Energy<99)
                                {
                                        RF_Energy++;  
                                
          if( 1 == page )
          {

              if(start_RF)
              {
                  power_Delay_con=0;
                  PWM_DUTY_CCR4_temp =0;
                  power_Delay_flag =1;
                  PWMA_CCR4H =(u16)(0);
                  PWMA_CCR4L =(u16)(0);
                  PWMA_IER  =0x01;    //  更新中断    //问题在这里

              }
              PWM_DUTY_CCR4 = CET_MIN_Energy_0[CET_MIN]+ ((CET_MAX_Energy_100[CET_MAX] - CET_MIN_Energy_0[CET_MIN] )* RF_Energy / 99 );  //百分比插入


          }
                                }         
                                       


        }        


void RF_on()        //RF开启-
{        
        if(!start_RF)
        {
        start_RF =1;
            Time_continued=0;
             F_otu =0;

            //PWMA_BKR = 0x80; // 使能主输出
             // PWMA_CR1 = 0x01; // PWM定时器
             power_Delay_flag =1;
          }
}


调整强度时,想用PWMA 更新中断,关闭PWMA。
PWMA_CCR4H =(u16)(0);
PWMA_CCR4L =(u16)(0);
这里我的理解是CCR从0开始到ARR。产生更新中断.因为不要能直接停止PWMA使能,需要跑一个或多个空周期。或者使用重复设数器跑几个空的再关闭使能。 我要控制这个,竟然没找到资料。控制开关电源输出电压,PWM转模拟

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:879809 发表于 2025-9-9 03:33 | 只看该作者
LM321构成LPF把PWM转成DC。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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