方波移相器

实现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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值