[DemoCode下载] ML51通过PWM生成正弦波信号

[复制链接]
1417|3
 楼主| xuanhuanzi 发表于 2023-11-28 19:16 | 显示全部楼层 |阅读模式
ML51_PWM_SINE-main.zip (2.42 MB, 下载次数: 2)
  1. /*_____ I N C L U D E S ____________________________________________________*/
  2. #include "ML51.h"
  3. #include <math.h>


  4. #include        "project_config.h"

  5. /*_____ D E C L A R A T I O N S ____________________________________________*/
  6. volatile uint8_t u8TH0_Tmp = 0;
  7. volatile uint8_t u8TL0_Tmp = 0;

  8. //UART 0
  9. //bit BIT_TMP;
  10. //bit BIT_UART;
  11. //bit uart0_receive_flag=0;
  12. //unsigned char uart0_receive_data;

  13. /*_____ D E F I N I T I O N S ______________________________________________*/
  14. #define SYS_CLOCK                                                                 (24000000ul)
  15. #define PWM_FREQ                                                                 (24000ul)
  16. #define PWM_CHANNEL                                   (2)

  17. #define SINE_FREQ                                        (60)
  18. #define SINE_RESOLUTION                                (360)
  19. #define Pi_Value                                                       (3.14159)

  20. volatile uint16_t PWM_Period = 0;
  21. uint16_t g_u16Sine_Count_u = 0;
  22. xdata uint16_t g_au16Sine[SINE_RESOLUTION] = {0};


  23. /*_____ M A C R O S ________________________________________________________*/

  24. volatile uint32_t BitFlag = 0;

  25. uint32_t counter_tick = 0;

  26. /*_____ F U N C T I O N S __________________________________________________*/


  27. void tick_counter(void)
  28. {
  29.         counter_tick++;
  30. }

  31. uint32_t get_tick(void)
  32. {
  33.         return (counter_tick);
  34. }

  35. void set_tick(uint32_t t)
  36. {
  37.         counter_tick = t;
  38. }

  39. void compare_buffer(uint8_t *src, uint8_t *des, int nBytes)
  40. {
  41.     uint16_t i = 0;       
  42.        
  43.     for (i = 0; i < nBytes; i++)
  44.     {
  45.         if (src[i] != des[i])
  46.         {
  47.             printf("error idx : %4d : 0x%2X , 0x%2X\r\n", i , src[i],des[i]);
  48.                         set_flag(flag_error , Enable);
  49.         }
  50.     }

  51.         if (!is_flag_set(flag_error))
  52.         {
  53.             printf("compare_buffer finish \r\n");       
  54.                 set_flag(flag_error , Disable);
  55.         }

  56. }

  57. void reset_buffer(void *dest, unsigned int val, unsigned int size)
  58. {
  59.     uint8_t *pu8Dest;
  60. //    unsigned int i;
  61.    
  62.     pu8Dest = (uint8_t *)dest;

  63.         #if 1
  64.         while (size-- > 0)
  65.                 *pu8Dest++ = val;
  66.         #else
  67.         memset(pu8Dest, val, size * (sizeof(pu8Dest[0]) ));
  68.         #endif
  69.        
  70. }

  71. void copy_buffer(void *dest, void *src, unsigned int size)
  72. {
  73.     uint8_t *pu8Src, *pu8Dest;
  74.     unsigned int i;
  75.    
  76.     pu8Dest = (uint8_t *)dest;
  77.     pu8Src  = (uint8_t *)src;


  78.         #if 0
  79.           while (size--)
  80.             *pu8Dest++ = *pu8Src++;
  81.         #else
  82.     for (i = 0; i < size; i++)
  83.         pu8Dest[i] = pu8Src[i];
  84.         #endif
  85. }

  86. void dump_buffer(uint8_t *pucBuff, int nBytes)
  87. {
  88.     uint16_t i = 0;
  89.    
  90.     printf("dump_buffer : %2d\r\n" , nBytes);   
  91.     for (i = 0 ; i < nBytes ; i++)
  92.     {
  93.         printf("0x%2X," , pucBuff[i]);
  94.         if ((i+1)%8 ==0)
  95.         {
  96.             printf("\r\n");
  97.         }            
  98.     }
  99.     printf("\r\n\r\n");
  100. }

  101. void  dump_buffer_hex(uint8_t *pucBuff, int nBytes)
  102. {
  103.     int     nIdx, i;

  104.     nIdx = 0;
  105.     while (nBytes > 0)
  106.     {
  107.         printf("0x%04X  ", nIdx);
  108.         for (i = 0; i < 16; i++)
  109.             printf("%02X ", pucBuff[nIdx + i]);
  110.         printf("  ");
  111.         for (i = 0; i < 16; i++)
  112.         {
  113.             if ((pucBuff[nIdx + i] >= 0x20) && (pucBuff[nIdx + i] < 127))
  114.                 printf("%c", pucBuff[nIdx + i]);
  115.             else
  116.                 printf(".");
  117.             nBytes--;
  118.         }
  119.         nIdx += 16;
  120.         printf("\n");
  121.     }
  122.     printf("\n");
  123. }

  124. void delay(uint16_t dly)
  125. {
  126. /*
  127.         delay(100) : 14.84 us
  128.         delay(200) : 29.37 us
  129.         delay(300) : 43.97 us
  130.         delay(400) : 58.5 us       
  131.         delay(500) : 73.13 us       
  132.        
  133.         delay(1500) : 0.218 ms (218 us)
  134.         delay(2000) : 0.291 ms (291 us)       
  135. */

  136.         while( dly--);
  137. }


  138. void send_UARTString(uint8_t* Data)
  139. {
  140.         #if 1
  141.         uint16_t i = 0;

  142.         while (Data[i] != '\0')
  143.         {
  144.                 #if 1
  145.                 SBUF = Data[i++];
  146.                 #else
  147.                 UART_Send_Data(UART0,Data[i++]);               
  148.                 #endif
  149.         }

  150.         #endif

  151.         #if 0
  152.         uint16_t i = 0;
  153.        
  154.         for(i = 0;i< (strlen(Data)) ;i++ )
  155.         {
  156.                 UART_Send_Data(UART0,Data[i]);
  157.         }
  158.         #endif

  159.         #if 0
  160.     while(*Data)  
  161.     {  
  162.         UART_Send_Data(UART0, (unsigned char) *Data++);  
  163.     }
  164.         #endif
  165. }

  166. void send_UARTASCII(uint16_t Temp)
  167. {
  168.     uint8_t print_buf[16];
  169.     uint16_t i = 15, j;

  170.     *(print_buf + i) = '\0';
  171.     j = (uint16_t)Temp >> 31;
  172.     if(j)
  173.         (uint16_t) Temp = ~(uint16_t)Temp + 1;
  174.     do
  175.     {
  176.         i--;
  177.         *(print_buf + i) = '0' + (uint16_t)Temp % 10;
  178.         (uint16_t)Temp = (uint16_t)Temp / 10;
  179.     }
  180.     while((uint16_t)Temp != 0);
  181.     if(j)
  182.     {
  183.         i--;
  184.         *(print_buf + i) = '-';
  185.     }
  186.     send_UARTString(print_buf + i);
  187. }

  188. void SineTable_Create(void)
  189. {
  190.     uint16_t i = 0;

  191.     /* Create sine table for lookup */
  192.     for (i = 0; i < SINE_RESOLUTION; i++)
  193.         /* Add 1.0 to offset sine result from [-1, 1] to [0, 2],
  194.         and divide with 2.0 to compress to [0, 1] */
  195.         g_au16Sine[i] = ((sin((i * Pi_Value) / 180.0) + 1.0) / 2.0) * PWM_Period;
  196. }

  197. void PWMx_Init(uint16_t ch , uint16_t uFrequency)
  198. {
  199.         uint32_t res = 0;

  200.         switch(ch)
  201.         {
  202.                 case 2:
  203.                 MFP_P03_PWM0_CH2;
  204.                 P03_PUSHPULL_MODE;
  205.                 break;
  206.         }
  207.        
  208.     PWM0_IMDEPENDENT_MODE;
  209.     PWM0_CLOCK_DIV_16;

  210. /*
  211.         PWM frequency   = Fpwm/((PWMPH,PWMPL)+1) = (24MHz/2)/(PWMPH,PWMPL)+1) = 20KHz
  212. */       

  213.         res = (SYS_CLOCK >> 4);                        // 2 ^ 4 = 16
  214.         res = res/uFrequency;
  215.         res = res - 1;

  216.         PWM_Period = res;

  217.         SFRS = 1;
  218.     PWM0PH = HIBYTE(res);
  219.     PWM0PL = LOBYTE(res);
  220.        
  221.         PWM0C2H = HIBYTE(g_au16Sine[g_u16Sine_Count_u]);
  222.         PWM0C2L = LOBYTE(g_au16Sine[g_u16Sine_Count_u]);

  223.     g_u16Sine_Count_u++;


  224.     /* Load PWM new setting and start PWM */
  225.     set_PWM0CON0_LOAD;
  226.     set_PWM0CON0_PWMRUN;       
  227.   
  228. }

  229. void GPIO_Init(void)
  230. {
  231. //        P03_PUSHPULL_MODE;               

  232. //        P30_PUSHPULL_MODE;       
  233. }


  234. void Timer1_IRQHandler(void)
  235. {
  236.         SFRS = 1;       
  237.         PWM0C2H = HIBYTE(g_au16Sine[g_u16Sine_Count_u]);
  238.         PWM0C2L = LOBYTE(g_au16Sine[g_u16Sine_Count_u]);

  239.     g_u16Sine_Count_u++;

  240.     /* Reset sine array pointer */
  241.     if (g_u16Sine_Count_u == SINE_RESOLUTION)
  242.         g_u16Sine_Count_u = 0;

  243.     /* Load PWM new setting and start PWM */
  244.     set_PWM0CON0_LOAD;
  245.     set_PWM0CON0_PWMRUN;

  246. }

  247. void Timer1_ISR(void) interrupt 3        // Vector [url=home.php?mod=space&uid=72445]@[/url]  0x0B
  248. {
  249.     clr_TCON_TF1;
  250.        
  251.         Timer1_IRQHandler();
  252. }

  253. void Timer1_Init(void)
  254. {
  255.         uint16_t res = 0;
  256.         uint16_t TIMER1_VALUE = 0;
  257.        
  258.         ENABLE_TIMER1_MODE2;
  259.     TIMER1_FSYS_DIV12;

  260.         /*
  261.           Time-out period = (0xFF - TIMER1_VALUE) / clock frequency
  262.                           = 1 / (sine wave frequency * sine wave resolution)

  263.                   TIMER1_VALUE = 0xFF - ((24 MHz / 12) / (60 Hz * resolution)
  264.                          
  265.         */
  266.        
  267.         TIMER1_VALUE = 0xFF - (2000000ul/(SINE_FREQ*SINE_RESOLUTION));
  268.        
  269.     TH1 = TIMER1_VALUE;
  270.     TL1 = TIMER1_VALUE;

  271.     ENABLE_TIMER1_INTERRUPT;                       //enable Timer0 interrupt
  272.     ENABLE_GLOBAL_INTERRUPT;                       //enable interrupts
  273.   
  274.     set_TCON_TR1;                                  //Timer0 run
  275. }


  276. void Timer0_IRQHandler(void)
  277. {
  278.        
  279.         tick_counter();

  280.         if ((get_tick() % 1000) == 0)
  281.         {
  282. //                P03 ^= 1;
  283.         }

  284. }

  285. void Timer0_ISR(void) interrupt 1        // Vector @  0x0B
  286. {
  287.     TH0 = u8TH0_Tmp;
  288.     TL0 = u8TL0_Tmp;
  289.     clr_TCON_TF0;
  290.        
  291.         Timer0_IRQHandler();
  292. }

  293. void Timer0_Init(void)
  294. {
  295.         uint16_t res = 0;

  296.         ENABLE_TIMER0_MODE1;
  297.     TIMER0_FSYS_DIV12;
  298.        
  299.         u8TH0_Tmp = HIBYTE(TIMER_DIV12_VALUE_1ms_FOSC_240000);
  300.         u8TL0_Tmp = LOBYTE(TIMER_DIV12_VALUE_1ms_FOSC_240000);

  301.     TH0 = u8TH0_Tmp;
  302.     TL0 = u8TL0_Tmp;

  303.     ENABLE_TIMER0_INTERRUPT;                       //enable Timer0 interrupt
  304.     ENABLE_GLOBAL_INTERRUPT;                       //enable interrupts
  305.   
  306.     set_TCON_TR0;                                  //Timer0 run
  307. }


  308. //void Serial_ISR (void) interrupt 4
  309. //{
  310. //    _push_(SFRS);

  311. //    if (RI)
  312. //    {   
  313. //      uart0_receive_flag = 1;
  314. //      uart0_receive_data = SBUF;
  315. //      clr_SCON_RI;                                         // Clear RI (Receive Interrupt).
  316. //    }
  317. //    if  (TI)
  318. //    {
  319. //      if(!BIT_UART)
  320. //      {
  321. //          TI = 0;
  322. //      }
  323. //    }

  324. //    _pop_(SFRS);       
  325. //}


  326. void UART0_Init(void)
  327. {
  328.         MFP_P31_UART0_TXD;                              // UART0 TXD use P1.6
  329.         P31_QUASI_MODE;                                  // set P1.6 as Quasi mode for UART0 trasnfer
  330.         UART_Open(SYS_CLOCK,UART0_Timer3,115200);        // Open UART0 use timer1 as baudrate generate and baud rate = 115200
  331.         ENABLE_UART0_PRINTF;


  332. //        printf("UART0_Init\r\n");
  333. }

  334. void SYS_Init(void)
  335. {
  336.         FsysSelect(FSYS_HIRC);

  337.     ALL_GPIO_QUASI_MODE;
  338. //    ENABLE_GLOBAL_INTERRUPT;                // global enable bit       
  339. }

  340. void main (void)
  341. {
  342.     SYS_Init();

  343.     UART0_Init();
  344.         GPIO_Init();

  345.         PWMx_Init(PWM_CHANNEL , PWM_FREQ);
  346.         SineTable_Create();
  347.        
  348.         Timer0_Init();
  349.         Timer1_Init();
  350.        
  351.     while(1)
  352.     {

  353.                
  354.     }
  355. }





heisexingqisi 发表于 2023-11-29 20:44 | 显示全部楼层
这是什么原理
捉虫天师 发表于 2023-11-30 16:02 | 显示全部楼层
有没有实现原理说明
EmmaTT 发表于 2023-12-6 10:46 来自手机 | 显示全部楼层
能讲解一下元件吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

2331

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部