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.

109 lines
3.7 KiB

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