个点占用1K字节的存储空间。在正弦波相位和幅值量化表中存储的数值相对于是以256个时钟为总周期的PWM调制波的高电平值。
PWM调制的本质是改变波形中高电平的比例,实际是波形在一个周期内的“面积”。
如果将PWM调制波进行低通滤波,取出其直流成分(平均值),滤除后的输出电压将线性正比于PWM的占空比。根据这个原理可以利用PWM输出作为低速DAC使用。
在软件中,DCO的时钟被配置为15.25MHz,但实际测试为15.802368MHz。SMCLK
的时钟源为DCOCLK。定时器TA的时钟源为SMCLK。定时器TA的CCR0为256,而且为了得到稳定的幅值,让正弦波的一个点持续输出占空比相同的60个PWM波形。相当于采样频率为:fclk?15802368/?256*60??1029Hz 则由公式6得:?f?
fclk1029Hz??1Hz 2N210当M=2时,相当于在1029Hz的采样率下,一个波形只取了512个点,输出波形为2Hz。
所以可得fout?M。利用此原理本作品实现了1到100Hz正弦波的产生。
以上对DDS原理和如何在软件中实现进行了介绍,下面软件具体内容进行介绍。
第二节 程序流程图进行介绍
(1) 主程序流程图
开机后,主程序首先关闭看门狗,接着对相应的I/O口、系统时钟、定时器TA进行初始化,完成后开总中断。然后,执行main函数。主程序流程图如图3.1所示。
开始系统初始化Main()函数 图3.1 主程序流程图
(2) 定时器中断服务程序流程图
定时器TA的中断服务程序中主要处理将相应频率的波转化成对应的PWM波输出。定时器中断服务程序流程图如图3.2所示。
定时器TA中断判断信号标志位Y正弦波标志位=1?N三角波标志位=1?N锯齿波标志位=1?YY三角波信号输出Y正弦波信号输出锯齿波信号输出返回
图3.2 定时器中断服务程序流程图
(3) 按键中断服务程序流程图
按键中断服务程序中主要处理波形的选择、频率的加减、信号输出使能等功能。按键中断服务程序流程图见图3.3。
按键中断N有按键?Y信号选择键按下?N“频率+”按下?NY是否长时间按下?YY输出频率加1是否长时间按下?Y输出频率快速递增Y关闭信号输出;置其他信号标志位;“频率-”按下?N“输出使能键”按下?N中断标志位清零输出频率减1输出频率快速递减Y信号输出返回
图3.3 按键中断服务程序流程图
第三节 子程序API介绍
(1) 函数名:void Port_init(void)
输入输出变量:无 功能:IO口初始化 void Port_init(void) {
P1SEL|=BIT2;//TA0.1 P1DIR|=BIT2;
P1DIR|=(BIT3+BIT4+BIT5);
P1OUT|=BIT5;//初始为Sine,点亮相应指示灯 P1OUT&=~(BIT3+BIT4); //四个按键
P1DIR&=~(BIT6+BIT7); P1IES|=BIT6+BIT7; P1IE|=BIT6+BIT7;
P2DIR&=~(BIT6+BIT7);//设为输入 P2SEL&=~(BIT6+BIT7);//关闭第二功能 P2IES|=BIT6+BIT7;//下降沿触发 P2IE|=BIT6+BIT7;//开中断 }
(2) 函数名:void Sys_clock_init(void)
输入输出变量:无 功能:系统时钟配置 void Sys_clock_init(void) {
DCOCTL = 0x60;//DC0=3
BCSCTL1= 0x8F;//0X88-RSEL=8 DCOCLK=1.6MHz 0X8F-RSEL=15 DCOCLK=15.25MHz for(unsigned int i=0;i<65535;i++);//延时,使系统时钟稳定 }
(3) 函数名:void TA_init(void)
输入输出变量:无 功能:定时器TA初始化 void TA_init(void) {
TACTL|=TASSEL_2+MC_1;//TA时钟源选择SMCLK,增计数模式 TACCTL1=OUTMOD_7;//模式7,PWM输出模式 TACCR0=255;
TACCTL0|=CCIE;//打开中断 }
(4) 函数名:__interrupt void TA_ISR (void)
输入输出变量:无
功能:定时器TA中断服务程序 #pragma vector=TIMERA0_VECTOR __interrupt void TA_ISR (void) {
if(WaveSelect==5)//Sine {
Count_line++;
if(Count_line>Sin_line) {
TACCR1=sin[M]; M+=Delt_M;
if(M>=1024) M=M-1024; Count_line=0; } }
if(WaveSelect==10)//Triangle {
Count_line++;
相关推荐: