方波移相器

方波移相器实现1khz占空比为50%方波的按键可调移相。(和普遍意义上的移相器差很多)。思路:采用定时器捕获模式,采集到上升沿或下降沿后延时,用DAC输出正或零电压。在做的过程中,程序编译没问题,但仿真出现奇怪的问题。比如:初始化函数仿真出现死循环,但单步执行进去又可以执行。按键函数,DAC初始化函数,定时器初始化函数初始化顺序不同,出现的问题也不同。问了同学后发现是中断速度太快,无法跑…

大家好,欢迎来到IT知识分享网。方波移相器

实现1khz占空比为50%方波的按键可调移相。(和普遍意义上的移相器差很多)。

思路:采用定时器捕获模式,采集到上升沿或下降沿后延时,用DAC输出正或零电压。

在做的过程中,程序编译没问题,但仿真出现奇怪的问题。比如:

初始化函数仿真出现死循环,但单步执行进去又可以执行。

按键函数,DAC初始化函数,定时器初始化函数初始化顺序不同,出现的问题也不同。

问了同学后发现是中断速度太快,无法跑进主程序里。在主函数的语句前后分别失能使能中断即可解决。

和中断密切相关的执行语句,放到中断里执行比较好。

最后代码如下:

中断函数:

使用定时器2通道1的捕获模式

//定时器2中断服务程序    
void TIM2_IRQHandler(void)
{

TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); //清除中断标志位      

            if(i==1)
            {

            DelayUs(detime);
            DAC_SetChannel1Data(DAC_Align_12b_R, 4000);//??DAC?
                i=0;
            TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);
            }
            else if(i==0)
            {

            DelayUs(detime);
            DAC_SetChannel1Data(DAC_Align_12b_R, 0);//??DAC?                 
            i=1;
            TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);

            }

}

主函数while(1)中的函数:

    key_v=CH452_GetKey();
                if(key_v==0x58)
        {

    
            if(detime<470)
            detime+=27;
            else
                detime=1;
                key_v=0;
            phase=((float)(detime))/1000*360;
            
            sprintf(buffer,”phase:%f”,phase);
            OLED_ShowStr(0,3,buffer,1);//测试6*8字符
        }
        else if(key_v==0x59)
        {

            if(detime>=27)
            detime-=27;
            else
            detime=1;
                    key_v=0;
                        phase=((float)(detime))/1000*360;
            
            sprintf(buffer,”phase:%f”,phase);
            OLED_ShowStr(0,3,buffer,1);//测试6*8字符
        }
        else{

            detime=detime;
                    key_v=0;
            phase=((float)(detime))/1000*360;
            
            sprintf(buffer,”phase:%f”,phase);
            OLED_ShowStr(0,3,buffer,1);//测试6*8字符
        }
        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

其中获取按键函数修改为:

uint8_t CH452_GetKey(void)
{

      int key=0;
    TIM_ClearITPendingBit(TIM2, ~TIM_IT_CC1);

  if(CH452_DOUT_GET())return 0xFF;
  CH452_Command(CH452_CMD_GETKEY,0,4);
  //
  if(CH452_DOUT_GET())key|=0x40;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x20;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x10;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x08;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x04;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x02;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  if(CH452_DOUT_GET())key|=0x01;
  CH452_DCLK_CLR();
  CH452_DCLK_SET();
  //
  if(key&0x40)return key&0xFF;
  else return 0xFF;
    
}

 

2019.7.22.9.22

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11823.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信