You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
3.3 KiB

4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
  1. #include "pwm.h"
  2. #define CLCK 48
  3. static double calculate_top(double target_frequency_hz) {
  4. int clck = 0;
  5. int top = 0;
  6. clck = CLCK * 1000 * 1000;
  7. top = clck / target_frequency_hz;
  8. return top;
  9. }
  10. void set_pwm_t16_pa4(int freqhz, float duty) {
  11. double top_double = calculate_top(freqhz / 1000.0); //������Ҫ��Ƶ�ʼ�����TOP���Զ���װ��ֵ��
  12. uint16_t top = (uint16_t)top_double;
  13. uint16_t Mat2 = (uint16_t)top_double * (duty / 100.0);
  14. uint16_t Mat3 = top;
  15. if (Mat2 >= top) Mat2 = top - 1;
  16. /////////////////////////////////////////////////
  17. T16Nx_Disable(T16N0);
  18. // PA4 T16N0_1
  19. T16Nx_BaseInitStruType x;
  20. T16Nx_PWMInitStruType y;
  21. /* ��ʼ��T16Nx��ʱ��*/
  22. x.T16Nx_ClkS = T16Nx_ClkS_PCLK; //ʱ��Դ48M
  23. x.T16Nx_SYNC = Disable; //��ͬ��
  24. x.T16Nx_EDGE = T16Nx_EDGE_Rise; //�����ش���
  25. x.T16Nx_Mode = T16Nx_Mode_PWM; // ѡ��PWMģʽ
  26. x.T16Nx_PREMAT = 0x01; /* Ԥ��Ƶ��1:1 */
  27. T16Nx_BaseInit(T16N0, &x);
  28. /* ����T16N0ͨ��1���� */
  29. y.T16Nx_MOE0 = Disable;
  30. y.T16Nx_MOE1 = Enable;
  31. y.T16Nx_POL0 = POSITIVE; //�ڴ��ڷ��͵�ʱ���������Դ������͵����������ܵ�������ͬ�������Դ����뷢�͵������෴������ô��֪����û������
  32. y.T16Nx_POL1 = POSITIVE;
  33. y.T16Nx_PWMMODE = T16Nx_PWMMode_INDEP; //ѡ������ģʽ
  34. y.PWMDZE = Disable; // PWM����ģʽ����ʹ��
  35. y.REGBUFEN = Enable; //�����Ĵ���ʹ�� (REGBUFENĿǰ��֪����ʲô�õ�)
  36. T16Nx_PMWOutInit(T16N0, &y);
  37. /* ����T16N0 ͨ��1���� */
  38. /*MAT2 MAT3 ͨ�����ж�����*/
  39. //ƥ���Ĵ���ֵƥ�����Ĺ���ģʽ���������Ժ��� ���������������ж�
  40. T16Nx_MAT2ITConfig(T16N0, T16Nx_Go_No);
  41. //ƥ���Ĵ���ֵƥ�����Ĺ���ģʽ,���㲢���¼����������ж�
  42. T16Nx_MAT3ITConfig(T16N0, T16Nx_Clr_Int);
  43. /*MAT2 MAT3 ƥ������������ƽ�ߵ�*/
  44. T16Nx_MAT2Out1Config(T16N0,
  45. T16Nx_Out_Low); //ƥ���������˿ڵ�ģʽ�������߻��ǵ�
  46. T16Nx_MAT3Out1Config(T16N0,
  47. T16Nx_Out_High); //ƥ���������˿ڵ�ģʽ�������߻��ǵ�
  48. //����������ģʽ�������ߵ͵�ƽ
  49. T16Nx_SetCNT1(T16N0, 0); //�趨�������ij�ʼֵ
  50. T16Nx_SetMAT2(T16N0, Mat2); //����ƥ���Ĵ�������ֵ
  51. T16Nx_SetMAT3(T16N0, Mat3); //����ƥ���Ĵ�������ֵ
  52. //���ü�������ֵ//���������õ���ʱ��ʱ��48M/48000=1khZ(�ڶ���ģʽ��PWM��������TOP1����ΪTOP+1��������������1ms)
  53. T16Nx_SetTOP1(T16N0, top);
  54. //����������ռ�ձ�
  55. /* ���������ܽ� */
  56. GPIO_InitSettingType initset;
  57. initset.Signal = GPIO_Pin_Signal_Digital; //����
  58. initset.Dir = GPIO_Direction_Output; //����ģʽ
  59. initset.Func = GPIO_Reuse_Func2; //���õ�T16N0_1����
  60. initset.ODE = GPIO_ODE_Output_Disable; //��©ʹ��
  61. initset.DS = GPIO_DS_Output_Normal; //��ͨ����ģʽ
  62. initset.PUE = GPIO_PUE_Input_Enable; //������ʹ��
  63. initset.PDE = GPIO_PDE_Input_Disable; //��������ֹ
  64. /* ����PA4ΪT16N0����ͨ��1 */
  65. GPIO_Init(GPIO_Pin_A4, &initset);
  66. T16Nx_Enable(T16N0);
  67. return;
  68. }
  69. //######################################################
  70. /**
  71. * @brief pwmռձ
  72. *
  73. * @param frequency
  74. * @param duty
  75. */
  76. void set_pwm_modbul_freq_duty(uint32_t frequencyhz, uint32_t duty) {
  77. printf("set_pwm_modbul_freq_duty freq:%d,duty%d\n", frequencyhz, duty);
  78. set_pwm_t16_pa4(frequencyhz,duty);
  79. printf("set_pwm_modbul_freq_duty freq:%d,duty%d\n", frequencyhz, duty);
  80. }
  81. //######################################################