我正在尝试使用 PWM 制造三相逆变器。 但我在控制正弦频率方面遇到了问题。
问题是我配置的 ADC 无法正常工作。 我使用的电位计输入0到3.3V 的值、ADC 没有显示最严格的数字(0到4096、因为是12位)、而是仅显示2000到2100之间的 ME 数字。
我真的不明白
这是我的完整代码。 除了对 ADC reading(lectura()函数的解释之外,一切都正常。
我找不到我的错误。
#include "driverlib/pin_map.h"
#include
#include
#include "inc/hw_gpio.h"
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pwm.h"
#include "driverlib/adc.h"
空 delayMS (无符号长整型 ms){
SysCtlDelay((SysCtlClockGet()/(27*10000)*ms );//lista tiene 90,SON 90 delay POR ciclo,ASI contratistar y time está en MS
}
uint32_t ADCValues[1];
内部时间= 200;
}
void lectura (){
ADCProcessorTrigger (ADC0_BASE、3);//触发 ADC 转换。
while (!ADCIntStatus (ADC0_BASE、3、false)){//等待转换完成。
ADCIntClear (ADC0_BASE、3);//清除 ADC 中断标志。
ADCSequenceDataGet (ADC0_BASE、3、ADCValues);//读取 ADC 值。
//time =(float) ADCValues[0];
if (ADCValues[0]<2000){time = 200;}
否则{time = 1000;}
}
int main (空)
{
INT S[90]={0,8,17,26,35,44,51,70,78,87,95,103,111,119,127,135,149,156,163,170,177,183,195,200,206,211,216,220,225,229,232,236,239,242,245,247,249,252,252,252,256,252,252,252,252,252,252,142,252,252,252,253,192,252,252,252,142,252,252,253,192,252,252,253,182,252,252,142,252,252,252,252,253,192,252,252,142,252,252,252,252,252,253,192,252,252,252,142,252,142,252,253,192,252,253,182,252,253,192,252,25
INT A = 0;
int b = 30;
int c = 60;
//设置时钟
SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
//配置 PWM 时钟以匹配系统
SysCtlPWMClockSet (SYSCTL_PWMDIV_1);
//启用此程序使用的外设。
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);//Tiva Launchpad 有两个模块(0和1)。 模块1涵盖 LED 引脚
GPIOPinTypeGPIOInput (GPIO_PORTF_BASE、GPIO_PIN_4);//使 F4成为输入
GPIOPadConfigSet (GPIO_PORTF_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);//启用 F4的上拉电阻、驱动强度不会影响输入
//将 PF1、PF2、PF3引脚配置为 PWM
GPIOPinConfigure (GPIO_PF1_M1PWM5);
GPIOPinConfigure (GPIO_PF2_M1PWM6);
GPIOPinConfigure (GPIO_PF3_M1PWM7);
GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
//ADC
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、3);
ADCIntClear (ADC0_BASE、3);
//配置 PWM 选项
//PWM_GEN_2涵盖 M1PWM4和 M1PWM5
//PWM_GEN_3涵盖 M1PWM6和 M1PWM7请参阅第207页4/11/13 DriverLib 文档
PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenConfigure (PWM1_base、PWM_GEN_3、PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
//设置周期(以时钟节拍表示)
PWMGenPeriodSet (PWM1_base、PWM_GEN_2、255);
PWMGenPeriodSet (PWM1_base、PWM_GEN_3、255);
//设置 PWM 占空比-50%(周期/2)
PWMPulseWidthSet (PWM1_base、PWM_OUT_5、SN[A]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_6、SN[b]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_7、SN[c]);
//启用 PWM 发生器
PWMGenEnable (PWM1_base、PWM_GEN_2);
PWMGenEnable (PWM1_base、PWM_GEN_3);
//PWMGenIntClear (PWM1_base、PWM_GEN_2、PWM_INT_CNT_ZERO);
//PWMGenIntClear (PWM1_base、PWM_GEN_3、PWM_INT_CNT_ZERO);
//打开输出引脚
PWMOutputState (PWM1_base、PWM_OUT_5_BIT | PWM_OUT_6_BIT | PWM_OUT_7_BIT、true);
while (1)
{
lectura();
uint32_t soldo=0;//用于保持 pinRead 的变量
SENTO= GPIOPinRead (GPIO_PORTF_BASE、GPIO_PIN_4);//读取 F4
if ((sando & GPIO_PIN_4)=0)
{
delayMS(时间);
如果(a=90) a=0;
if (b=90) b = 0;
如果(c=90) c = 0;
PWMPulseWidthSet (PWM1_base、PWM_OUT_5、SN[A]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_6、SN[b]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_7、SN[c]);
A = A+1;
b = b+1;
C = c+1;
}
否则{
delayMS(时间);
如果(a=90) a=0;
if (b=90) b = 0;
如果(c=90) c = 0;
PWMPulseWidthSet (PWM1_base、PWM_OUT_5、SN[A]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_6、SN[c]);
PWMPulseWidthSet (PWM1_base、PWM_OUT_7、SN[b]);
A = A+1;
b = b+1;
C = c+1;
}
}
谢谢、
佩德罗 A