dsPIC33F单片机产生正弦波形

  • Post author:
  • Post category:其他


#include <p33FJ128MC506A.h>
#include "dac.h"
#include "delay.h"
/* -------------------------------------------------------- */
/* Macros for setting device configuration registers        */
/* -------------------------------------------------------- */


_FOSCSEL(FNOSC_FRCPLL); //内部快速RC振荡 & PLL
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_NONE); //时钟开关使能,时钟监视器禁止,时钟输出为数字输出,标准振荡模式
/* Clock Switching Enabled and Fail Safe Clock Monitor is disable
   Primary Oscillator Mode: XT Crystal */
_FBS(BSS_NO_FLASH & BWRP_WRPROTECT_OFF); //无BOOT代码段,BOOT段写保护关
_FWDT(FWDTEN_OFF); //WDT 关
_FGS(GSS_HIGH & GCP_ON & GWRP_ON); //代码保护高级及标准代码保护开,写保护开启,
_FPOR(PWMPIN_ON & HPOL_ON & LPOL_ON & FPWRT_PWR128); //PWM 模式为 端口寄存器模式,PWM 上桥为低电平有效模式,下桥为低电平有效模式;上电复位时间为128毫秒
_FICD(ICS_PGD2 & JTAGEN_OFF); //使用 PGC3/PGD3 作为编程和调试用 ,JTAG 关闭


unsigned char time_IF=0;
unsigned int delay_data;
const unsigned int sindata[360]={
688	,
694	,
700	,
705	,
711	,
717	,
723	,
729	,
735	,
741	,
747	,
753	,
758	,
764	,
770	,
776	,
781	,
787	,
793	,
798	,
804	,
810	,
815	,
820	,
826	,
831	,
837	,
842	,
847	,
852	,
857	,
863	,
868	,
873	,
877	,
882	,
887	,
892	,
896	,
901	,
906	,
910	,
914	,
919	,
923	,
927	,
931	,
935	,
939	,
943	,
947	,
951	,
954	,
958	,
961	,
965	,
968	,
971	,
974	,
977	,
980	,
983	,
986	,
988	,
991	,
993	,
996	,
998	,
1000	,
1002	,
1004	,
1006	,
1008	,
1010	,
1011	,
1013	,
1014	,
1016	,
1017	,
1018	,
1019	,
1020	,
1020	,
1021	,
1022	,
1022	,
1023	,
1023	,
1023	,
1023	,
1023	,
1023	,
1023	,
1022	,
1022	,
1021	,
1020	,
1020	,
1019	,
1018	,
1017	,
1016	,
1014	,
1013	,
1011	,
1010	,
1008	,
1006	,
1004	,
1002	,
1000	,
998	,
996	,
993	,
991	,
988	,
986	,
983	,
980	,
977	,
974	,
971	,
968	,
965	,
961	,
958	,
954	,
951	,
947	,
943	,
939	,
935	,
931	,
927	,
923	,
919	,
914	,
910	,
906	,
901	,
896	,
892	,
887	,
882	,
877	,
873	,
868	,
863	,
857	,
852	,
847	,
842	,
837	,
831	,
826	,
820	,
815	,
810	,
804	,
798	,
793	,
787	,
781	,
776	,
770	,
764	,
758	,
753	,
747	,
741	,
735	,
729	,
723	,
717	,
711	,
705	,
700	,
694	,
688	,
682	,
676	,
670	,
664	,
658	,
652	,
646	,
640	,
634	,
628	,
622	,
617	,
611	,
605	,
599	,
593	,
588	,
582	,
576	,
571	,
565	,
559	,
554	,
548	,
543	,
537	,
532	,
527	,
521	,
516	,
511	,
506	,
501	,
496	,
491	,
486	,
481	,
476	,
472	,
467	,
462	,
458	,
453	,
449	,
445	,
440	,
436	,
432	,
428	,
424	,
420	,
416	,
413	,
409	,
406	,
402	,
399	,
395	,
392	,
389	,
386	,
383	,
380	,
378	,
375	,
372	,
370	,
367	,
365	,
363	,
361	,
359	,
357	,
355	,
354	,
352	,
350	,
349	,
348	,
347	,
346	,
345	,
344	,
343	,
342	,
342	,
341	,
341	,
341	,
340	,
340	,
340	,
341	,
341	,
341	,
342	,
342	,
343	,
344	,
345	,
346	,
347	,
348	,
349	,
350	,
352	,
354	,
355	,
357	,
359	,
361	,
363	,
365	,
367	,
370	,
372	,
375	,
378	,
380	,
383	,
386	,
389	,
392	,
395	,
399	,
402	,
406	,
409	,
413	,
416	,
420	,
424	,
428	,
432	,
436	,
440	,
445	,
449	,
453	,
458	,
462	,
467	,
472	,
476	,
481	,
486	,
491	,
496	,
501	,
506	,
511	,
516	,
521	,
527	,
532	,
537	,
543	,
548	,
554	,
559	,
565	,
571	,
576	,
582	,
588	,
593	,
599	,
605	,
611	,
617	,
622	,
628	,
634	,
640	,
646	,
652	,
658	,
664	,
670	,
676	,
682

};

const unsigned int sindata2[360]={
443	,
445	,
447	,
449	,
451	,
453	,
455	,
457	,
459	,
461	,
463	,
465	,
467	,
469	,
471	,
473	,
475	,
477	,
479	,
481	,
483	,
485	,
487	,
489	,
490	,
492	,
494	,
496	,
498	,
499	,
501	,
503	,
505	,
506	,
508	,
510	,
511	,
513	,
514	,
516	,
518	,
519	,
521	,
522	,
523	,
525	,
526	,
528	,
529	,
530	,
532	,
533	,
534	,
535	,
536	,
538	,
539	,
540	,
541	,
542	,
543	,
544	,
545	,
546	,
547	,
547	,
548	,
549	,
550	,
550	,
551	,
552	,
552	,
553	,
554	,
554	,
555	,
555	,
555	,
556	,
556	,
556	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
557	,
556	,
556	,
556	,
555	,
555	,
555	,
554	,
554	,
553	,
552	,
552	,
551	,
550	,
550	,
549	,
548	,
547	,
547	,
546	,
545	,
544	,
543	,
542	,
541	,
540	,
539	,
538	,
536	,
535	,
534	,
533	,
532	,
530	,
529	,
528	,
526	,
525	,
523	,
522	,
521	,
519	,
518	,
516	,
514	,
513	,
511	,
510	,
508	,
506	,
505	,
503	,
501	,
499	,
498	,
496	,
494	,
492	,
490	,
489	,
487	,
485	,
483	,
481	,
479	,
477	,
475	,
473	,
471	,
469	,
467	,
465	,
463	,
461	,
459	,
457	,
455	,
453	,
451	,
449	,
447	,
445	,
443	,
441	,
439	,
437	,
435	,
433	,
431	,
429	,
427	,
425	,
423	,
421	,
419	,
417	,
415	,
413	,
411	,
409	,
407	,
405	,
403	,
401	,
400	,
398	,
396	,
394	,
392	,
390	,
388	,
387	,
385	,
383	,
381	,
380	,
378	,
376	,
375	,
373	,
371	,
370	,
368	,
367	,
365	,
363	,
362	,
360	,
359	,
358	,
356	,
355	,
354	,
352	,
351	,
350	,
348	,
347	,
346	,
345	,
344	,
343	,
342	,
341	,
340	,
339	,
338	,
337	,
336	,
335	,
334	,
333	,
333	,
332	,
331	,
331	,
330	,
330	,
329	,
328	,
328	,
328	,
327	,
327	,
326	,
326	,
326	,
326	,
325	,
325	,
325	,
325	,
325	,
325	,
325	,
325	,
325	,
325	,
325	,
326	,
326	,
326	,
326	,
327	,
327	,
328	,
328	,
328	,
329	,
330	,
330	,
331	,
331	,
332	,
333	,
333	,
334	,
335	,
336	,
337	,
338	,
339	,
340	,
341	,
342	,
343	,
344	,
345	,
346	,
347	,
348	,
350	,
351	,
352	,
354	,
355	,
356	,
358	,
359	,
360	,
362	,
363	,
365	,
367	,
368	,
370	,
371	,
373	,
375	,
376	,
378	,
380	,
381	,
383	,
385	,
387	,
388	,
390	,
392	,
394	,
396	,
398	,
400	,
401	,
403	,
405	,
407	,
409	,
411	,
413	,
415	,
417	,
419	,
421	,
423	,
425	,
427	,
429	,
431	,
433	,
435	,
437	,
439	,
441
};
void PortInit()
{
    LATB = 0x0000;  // B端口清零
    TRISB = 0x0000; // B端口设为输入, 0: out, 1: in
    PORTB = 0x0000;
}
void Timer1Init(void)
{
    T1CON = 0;              // 确保T1关闭,再进行初始化
    IFS0bits.T1IF = 0;      // 清T1复位标志,使T1复位
    IPC0bits.T1IP = 5;      // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
    IEC0bits.T1IE = 1;      // 开T1中断
    T1CONbits.TCKPS = 1;    // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
                            // 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
    PR1 = 4000;             // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
                            // 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
    T1CONbits.TON = 1;      // 打开T1并开始计数
}
void Timer2Init(void)
{
    T2CON = 0;              // 确保T1关闭,再进行初始化
    IFS0bits.T2IF = 0;      // 清T1复位标志,使T1复位
    IPC1bits.T2IP = 5;      // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
    IEC0bits.T2IE = 1;      // 开T1中断
    T2CONbits.TCKPS = 1;    // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
                            // 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
    T2CONbits.TSIDL = 0;
    PR2 = 4000;             // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
                            // 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
    T2CONbits.TON = 1;      // 打开T1并开始计数
}
void Timer3Init(void)
{
    T3CON = 0;              // 确保T1关闭,再进行初始化
    IFS0bits.T3IF = 0;      // 清T1复位标志,使T1复位
    IPC2bits.T3IP = 5;      // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
    IEC0bits.T3IE = 1;      // 开T1中断
    T3CONbits.TCKPS = 1;    // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
                            // 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
    T3CONbits.TSIDL = 0;
    PR3 = 4000;             // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
                            // 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
    T3CONbits.TON = 1;      // 打开T1并开始计数
}
void Timer4Init(void)
{
    T4CON = 0;              // 确保T1关闭,再进行初始化
    IFS1bits.T4IF = 0;      // 清T1复位标志,使T1复位
    IPC6bits.T4IP = 5;      // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
    IEC1bits.T4IE = 1;      // 开T1中断
    T4CONbits.TCKPS = 1;    // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
                            // 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
    T4CONbits.TSIDL = 0;
    PR4 = 4000;             // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
                            // 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
    T4CONbits.TON = 1;      // 打开T1并开始计数
}
void Timer5Init(void)
{
    T5CON = 0;              // 确保T1关闭,再进行初始化
    IFS1bits.T5IF = 0;      // 清T1复位标志,使T1复位
    IPC7bits.T5IP = 5;      // 3个BIT,设置T1的中断优先级,0~7,7是做高优先级
    IEC1bits.T5IE = 1;      // 开T1中断
    T5CONbits.TCKPS = 1;    // 设置T1的预分频比是8,即T1加一次需要的时间为1/(32M/8)秒,即0.25uS
                            // 2个bit,00--1:1,01--1:8,10--1:64,11--1:256
    T5CONbits.TSIDL = 0;
    PR5 = 4000;             // 根据计算应该是从0开始计数,加到PR1时产生中断,跟以往的MCU溢出中断不同
                            // 这个寄存器的值计算结果为,400~40000分别对应10KHz到100Hz
    T5CONbits.TON = 1;      // 打开T1并开始计数
}
int main(void)
{
    // 设置振荡方式及倍频, PLL 反馈倍频比寄存器
    PLLFBD = 41;            // dPLL derived in UserParms.h	PLL反馈倍频比 Fosc = Fin*(M/(N1*N2))
    CLKDIVbits.PLLPOST = 0; // N2=2 后分频比为2
    CLKDIVbits.PLLPRE = 0;  // N1=2	预分频比为2
    __builtin_write_OSCCONH(0x01);    // 设置带PLL的内部FRC振荡器。
    __builtin_write_OSCCONL(0x01);    // 请求切换到所要求的振荡器
    while (OSCCONbits.COSC != 0b01);  // 是否写入带PLL的内部振荡器,PLL

   /
    PortInit();
    Timer1Init();
    Timer2Init();
    Timer3Init();
    Timer4Init();
    Timer5Init();
    
    while(1)
    {
        // DAC_init(sindata2[i]); //delay(0)时正弦周期为40us
    }
}

//====================定时中断服务程序======================
void __attribute__((__interrupt__,no_auto_psv)) _T1Interrupt(void)
{
        // PR1=40320/Ftimer1;   //计算定时器的溢出值
        IFS0bits.T1IF = 0;    //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T2Interrupt(void)
{
        // PR1=40320/Ftimer1;   //计算定时器的溢出值
        IFS0bits.T2IF = 0;    //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T3Interrupt(void)
{
        // PR1=40320/Ftimer1;   //计算定时器的溢出值
        IFS0bits.T3IF = 0;    //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T4Interrupt(void)
{
        // PR1=40320/Ftimer1;   //计算定时器的溢出值
        IFS1bits.T4IF = 0;    //在软件里清中断标志
}
void __attribute__((__interrupt__,no_auto_psv)) _T5Interrupt(void)
{
        // PR1=40320/Ftimer1;   //计算定时器的溢出值
        IFS1bits.T5IF = 0;    //在软件里清中断标志
}



版权声明:本文为Augusdi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。