完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我想利用定时器A溢出中断,每次中断改变一次DAC模块中 DAC12_0DAT寄存器的值,从而输出方波。不知道为什么输出的波形并不是严格的方波,而是时断时续的。以下是我的部分程序。/****************************PWM部分**************************************/ /***************************************************************************** * 设置timerA输出PWM的工作模式 *****************************************************************************/ void PWM_Init(void) { P1SEL |= BIT2; //P12口输出PWM信号 P1DIR |= BIT2; //P12口接入一个LED发光二极管 TACCR0 = T; //CCR0周期(频率)的设定 TACTL |= TASSEL0 + MC0 + TACLR + TAIE; //aclk做时钟源32768,1分频,增加计数模式,开中断 } //*********************************************************************** // TIMERA中断服务程序,需要判断中断类型 //*********************************************************************** #pragma vector = TIMERA1_VECTOR __interrupt void Timer_A(void) { switch(TAIV) //需要判断中断的类型 { case 2:break; case 4:break; case 10:Count++;break; //设置标志位Flag } if(Count==1) { DAC12_0DAT =OUT1; _NOP(); } else if(Count==2) { DAC12_0DAT =OUT2; _NOP(); } else if(Count==3) { DAC12_0DAT =OUT3; _NOP(); } else if(Count==4) { Count=0; DAC12_0DAT =OUT4; _NOP(); } } /******************************************************************** DAC12初始化设置程序 ********************************************************************/ void DAC12_Init(void) { DAC12_0CTL |= DAC12CALON; //启动校验DAC while((DAC12_0CTL & DAC12CALON) != 0){_NOP();}//等待校验完成 ADC12CTL0 = REFON + REF2_5V; // 参考电压为内部2.5v DAC12_0CTL = DAC12AMP_5 + DAC12IR + DAC12ENC;//控制寄存器设置,自动更新数据,内基准为满量程 DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // 内部参考源为3 DAC12_1DAT = H; // 1.25V } //************************************************************************* // 主函数 //************************************************************************* void main(void) { WDT_Init(); //看门狗设置 Clock_Init(); //系统时钟设置 Port_Init(); UART_Init(); //串口设置初始化 PWM_Init(); //设置TIMERA,P12输出PWM信号 DAC12_Init(); _EINT(); //开总中断 while(1) //无限循环 { } } 当设置 int OUT1=65535; int OUT2=65535; int OUT3=0; int OUT4=0;时,得到如下波形 |
|
相关推荐
1个回答
|
|
刚才又调试了一遍,终于发现是哪错了...
其实是一个挺蠢的错误,原来是我在程序里同时使用了A,B两个定时器,两个定时器的计数变量我都设为count了 //*********************************************************************** // TIMERA中断服务程序,需要判断中断类型 //*********************************************************************** #pragma vector = TIMERA1_VECTOR __interrupt void Timer_A(void) { switch(TAIV) //需要判断中断的类型 { case 2:break; case 4:break; case 10:Count++;break; //设置标志位Flag } if(Count==1) { DAC12_0DAT =OUT1; _NOP(); } else if(Count==2) { DAC12_0DAT =OUT2; _NOP(); } else if(Count==3) { DAC12_0DAT =OUT3; _NOP(); } else if(Count==4) { Count=0; DAC12_0DAT =OUT4; _NOP(); } } //*********************************************************************** // TIMERB中断服务程序,需要判断中断类型 //*********************************************************************** #pragma vector = TIMERB1_VECTOR __interrupt void Timer_B(void) { switch(TBIV) //需要判断中断的类型 { case 2:break; case 4:break; case 14:CountB++;break; //设置标志位Flag } if(CountB==100) //100次为1秒 { Second++; CountB=0; //P6OUT = ~(P6OUT&BIT1); //P61取反闪烁 } while(Second>104)Second=0; //最大计数99秒 } 把它们改成countA和countB就解决了... 发上来给大家参考一下 |
|
|
|
只有小组成员才能发言,加入小组>>
3053个成员聚集在这个小组
加入小组2970 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3695 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2366 浏览 1 评论
4832 浏览 1 评论
2592 浏览 1 评论
1410浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3697浏览 2评论
2972浏览 1评论
1602浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 08:05 , Processed in 1.530703 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号