|
|
#include "pwm.h"
#define CLCK 48
void t16_pa4_init(void) { // PA4 T16N0_1
T16Nx_BaseInitStruType x; T16Nx_PWMInitStruType y; /* ��ʼ��T16Nx��ʱ��*/ x.T16Nx_ClkS = T16Nx_ClkS_PCLK; //ʱ��Դ48M
x.T16Nx_SYNC = Disable; //��ͬ��
x.T16Nx_EDGE = T16Nx_EDGE_Rise; //�����ش���
x.T16Nx_Mode = T16Nx_Mode_PWM; // ѡ��PWMģʽ
x.T16Nx_PREMAT = 0x01; /* Ԥ��Ƶ��1:1 */ T16Nx_BaseInit(T16N0, &x); /* ����T16N0ͨ��1���� */ y.T16Nx_MOE0 = Disable; y.T16Nx_MOE1 = Enable; y.T16Nx_POL0 = POSITIVE; //�ڴ��ڷ��͵�ʱ���������Դ������͵����������ܵ�������ͬ�������Դ����뷢�͵������෴������ô��֪����û������
y.T16Nx_POL1 = POSITIVE; y.T16Nx_PWMMODE = T16Nx_PWMMode_INDEP; //ѡ������ģʽ
y.PWMDZE = Disable; // PWM����ģʽ����ʹ��
y.REGBUFEN = Enable; //�����Ĵ���ʹ�� (REGBUFENĿǰ��֪����ʲô�õ�)
T16Nx_PMWOutInit(T16N0, &y); /* ����T16N0 ͨ��1���� */ /*MAT2 MAT3 ͨ�����ж�����*/ //ƥ���Ĵ���ֵƥ�����Ĺ���ģʽ���������Ժ��� ���������������ж�
T16Nx_MAT2ITConfig(T16N0, T16Nx_Go_No); //ƥ���Ĵ���ֵƥ�����Ĺ���ģʽ,���㲢���¼����������ж�
T16Nx_MAT3ITConfig(T16N0, T16Nx_Clr_Int);
/*MAT2 MAT3 ƥ������������ƽ�ߵ�*/ T16Nx_MAT2Out1Config(T16N0, T16Nx_Out_Low); //ƥ���������˿ڵ�ģʽ���������ǵ�
T16Nx_MAT3Out1Config(T16N0, T16Nx_Out_High); //ƥ���������˿ڵ�ģʽ���������ǵ�
//����������ģʽ�������ߵ͵�ƽ
T16Nx_SetCNT1(T16N0, 0); //�趨�������ij�ʼֵ
T16Nx_SetMAT2(T16N0, 0); //����ƥ���Ĵ�������ֵ
T16Nx_SetMAT3(T16N0, 0); //����ƥ���Ĵ�������ֵ
//���ü�������ֵ//���������õ���ʱ��ʱ��48M/48000=1khZ(�ڶ���ģʽ��PWM��������TOP1����ΪTOP+1��������������1ms)
T16Nx_SetTOP1(T16N0, 0); //����������ռ�ձ�
/* ���������ܽ� */ GPIO_InitSettingType initset;
initset.Signal = GPIO_Pin_Signal_Digital; //����
initset.Dir = GPIO_Direction_Output; //����ģʽ
initset.Func = GPIO_Reuse_Func2; //���õ�T16N0_1����
initset.ODE = GPIO_ODE_Output_Disable; //��©ʹ��
initset.DS = GPIO_DS_Output_Normal; //��ͨ����ģʽ
initset.PUE = GPIO_PUE_Input_Enable; //������ʹ��
initset.PDE = GPIO_PDE_Input_Disable; //��������ֹ
/* ����PA4ΪT16N0����ͨ��1 */ GPIO_Init(GPIO_Pin_A4, &initset); T16Nx_Enable(T16N0); return; }
//######################################################
static double calculate_top(double target_frequency) { int clck = 0; int target_frequency_hz = 0; int top = 0; clck = CLCK * 1000 * 1000; target_frequency_hz = (int)target_frequency * 1000; // printf("target_frequency_hz%d\n", target_frequency_hz);
top = clck / target_frequency_hz; // printf("top%d\t\n", top);
return top; } static double calculate_MAT2(double top, double duty) { double percentage_duty = 0; double Mat2 = 0; percentage_duty = duty / 100; Mat2 = top * percentage_duty; return Mat2; } /**
* @brief ����pwm������ռ�ձ� * * @param frequency * @param duty */ void set_pwm_modbul_freq_duty(uint32_t frequency, uint32_t duty) { double top = 0; double Mat2 = 0; if (frequency > CLCK * 1000) { printf("out of range\n"); return; } top = calculate_top(frequency); //������Ҫ��Ƶ�ʼ�����TOP���Զ���װ��ֵ��
if (top == 0) { return; } Mat2 = calculate_MAT2(top, duty); printf("top:\t%2.lf\n", top); printf("MAT2:\t%2.lf\n", Mat2); printf("MAT3:\t%2.lf\n", top); T16Nx_Disable(T16N0); t16_pa4_init(); T16Nx_SetMAT2(T16N0, Mat2); if (duty == 100) { T16Nx_SetMAT3(T16N0, top - 1); } else { T16Nx_SetMAT3(T16N0, top); } T16Nx_SetTOP1(T16N0, top); } //######################################################
|