This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP-EXP432P4111:基于 ADC 值以延迟更新 LCD

Guru**** 2516170 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/789848/ccs-msp-exp432p4111-updating-lcd-based-on-adc-value-with-a-delay

器件型号:MSP-EXP432P4111

工具/软件:Code Composer Studio

您好!

我使用 DriverLib 和 ADC14对 P5.5上的电压进行采样、并使用 LCD 显示该电压(除以2)。  

我目前正在使用硬编码 while 环路来增加延迟、这样我的显示器就不会饱和。 不过、我这样做的方法是降低我不希望的 ADC 的采样率。

如何为 ADC/LCD 环路添加延迟、以使 ADC 采样率不会降低?

我已经尝试使用 SysTick 计时器、但这不起作用。

请参阅下面的 ADC/LCD 更新代码。

void ADC14_IRQHandler (void)
{
uint64_t status = MAP_ADC14_getEnabableInterruptStatus();
MAP_ADC14_clearInterruptFlag (status);

IF (ADC_INT0和状态)
{
节拍= 0;
curADCResult = MAP_ADC14_getResult (ADC_MEM0);
curADCResult =(curADCResult * 1650)/(16384);//将2:1 in 与 LCD 电压之比缩放
normalizedADCRes=(uint16_t) curADCResult;//将 ADC 值截断为四位数以显示在 LCD 上
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (四个+ 48个、char1);//传递要显示的 ADC 值
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 100000){ //硬编码 while 循环用于延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); //更新 LCD 屏幕,使其不存储内存
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_TONN();

}
} 


我的目标是将 PWM 信号输出到低通滤波器、然后输出到 MOSFET 的栅极、并在0-1A 之间控制电流。 我需要该范围内的32阶电流、我需要通过 ADC 进行校准以补偿误差。 我的电流将通过 INA250进行感测。

以下是上下文中的完整代码:

/* DriverLib 包括*/
#include 

/*标准包括*/
#include 
#include 

易失性 uint32_t Tick;

void ADC14_IRQHandler (void);
void Port1_IRQHandler (void);

#define char1 16 //数字 A1 - L16
#define char2 32 //数字 A2 - L32
#define char3 40 //数字 A3 - L40
#define char4 36 //数字 A4 - L36
#define char5 28 //数字 A5 - L28
#define char6 44 //数字 A6 - L44

const char 位[10][4]=
{
{0xC、0xF、0x8、0x2}、/*"0" LCD 段 A+b+c+d+e+f+k+q */
{0x0、0x6、0x0、0x2}、/*"1"*/
{0xB、0xD、0x0、0x0}、/*"2"*/
{0x3、0xF、0x0、0x0}、/*"3"*/
{0x7、0x6、0x0、0x0}、/*"4"*/
{0x7、0xB、0x0、0x0}、/*"5"*/
{0xF、0xB、0x0、0x0}、/*"6"*/
{0x4、0xE、0x0、0x0}、/*"7"*/
{0xF、0xF、0x0、0x0}、/*"8"*/
{0x7、0xF、0x0、0x0}/*"9"*}
;

const char alphaBig[26][4]=
{
{0xF、0xE、0x0、0x0}、/*"A" LCD 段 A+b+c+e+f+g+m */
{0x1、0xF、0x0、0x5}、/*"B"*/
{0xC、0x9、0x0、0x0}、/*"C"*/
{0x0、0xF、0x0、0x5}、/*"D"*/
{0xF、0x9、0x0、0x0}、/*"E"*/
{0xF、0x8、0x0、0x0}、/*"F"*/
{0xD、0xB、0x0、0x0}、/*"G"*/
{0xF、0x6、0x0、0x0}、/*"H"*/
{0x0、0x9、0x0、0x5}、/*"i"*/
{0x8、0x7、0x0、0x0}、/*"J"*/
{0xE、0x0、0x2、0x2}、/*"K"*/
{0xC、0x1、0x0、0x0}、/*"L"*/
{0xC、0x6、0x0、0xA}、/*"M"*/
{0xC、0x6、0x2、0x8}、/*"N"*
{0xC、0xF、0x0、0x0}、/*"O"*/
{0xF、0xC、0x0、0x0}、/*"P"*/
{0xC、0xF、0x2、0x0}、/*"Q"*/
{0xF、0xC、0x2、0x0}、/*"R"*/
{0x7、0xB、0x0、0x0}、/*"S"*/
{0x0、0x8、0x0、0x5}、/*"T"*/
{0xC、0x7、0x0、0x0}、/*"U"*/
{0xC、0x0、0x8、0x2}、/*"V"*/
{0xC、0x6、0xA、0x0}、/*"W"*/
{0x0、0x0、0xA、0xA}、/*"X"*/
{0x0、0x0、0x0、0xB}、/*"Y"*/
{0x0、0x9、0x8、0x2}/*"Z"*/
};

静态易失性浮点 curADCResult;
静态易失性 uint16_t normalizedADCRes;
静态易失性 char 1;//要传递到 LCD
静态易失性 char 2的字符;
静态易失性 char 3;
静态易失性 char 4;

静态空 showchar (c、int 位置 char);

/* LCD 的配置结构*/
LCD_F_Config lcdConf =
{
时钟源= LCD_F_CLOCKSOURCE_ACLK、
时钟分频器= LCD_F_CLOCKDIVIDER_32、
时钟预分频器= LCD_F_CLOCKPRESCALER_1、
muxRate = LCD_F_4_MUX、
波形= LCD_F_standard_waveform、
.Segments = LCD_F_Segse_enabled
};


//![简单 Timer_A 配置]
// Timer_A PWM 配置参数*/
Timer_A_PWMConfig pwmConfig =
{
Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_divider _1、
166、//144.5KHz PWM 信号
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_RESET_SET、
0
};
//![Simple Timer_A Config]

void lcdupdate (void){
节拍= 0;
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (4 + 48、char1);
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 1000000){//硬编码延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3);
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_turnon ();
}

int main (void)
{

Tick = 0;

//暂停看门狗*/
MAP_WDT_A_HOLDTimer();

//初始化引脚中的所有功能选择位*/
P3->SEL1 |= 0xF2;
P6->SEL1 |= 0x0C;
P7->SEL1 |= 0xF0;
P8->SEL1 |= 0xFC;
P9->SEL1;= 0xSEFF |= 0x9;
P10->SEL1 |= 0x3F;

//将 ACLK 设置为基准振荡器*/
CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_Clock_divider _1);

//初始化 LCD_F 模块
(&lcdConf);

//清除
LCD_F_line


;//设置 LCD_F_line 和 LCD_F_line;

* RF_F_ENCOM_F_END_REF_IN_LINE_LCD_END_F_INEST_LINE_LCD_INEST_REF_LINE_LCD_N (* 1)* 1;* 1
LCD_F_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、 LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);

/*在*/
lcd_f_turnon ()上使用 LCD_F 模块;

//---------------

//![Simple Timer_A 示例]
对于 LF 模式、//将 MCLK 设置为 REFO 为128Khz
*将 SMCLK 设置为64Khz */
MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24);
MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
// MAP_CS_setReferenceOscillatorFrequency (CS_REFO_128KHZ);
// MAP_CS_initClockSignal (CS_MCLK、 CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_1);
// MAP_CS_initClockSignal (CS_SMCLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_2);
MAP_PCM_setPowerState (PCM_AM_LF_VCORE0);

/*将 GPIO2.4配置为 PWM 的外设输出、将 P6.7配置为按钮的外设输出
*中断*/
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、
GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);

/*将 Timer_A 配置为具有大约500ms 的周期和
*初始占空比为其10%(3200个节拍)*/
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
//![Simple Timer_A 示例]

/*启用中断并启动看门狗计时器*/
MAP_Interrupt_enableInterrupt (INT_Port1);
MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableMaster();

/*不使用时睡眠*////-------------------------------------------------------


/*初始化变量*/
curADCResult = 0;

/*设置闪存等待状态*/
MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);
MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);

/*将 DCO 设置为48MHz */
MAP_PCM_setPowerState (PCM_AM_LDO_VCORE1);
//map_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);

/*启用 FPU 进行浮点运算*/
map_fpu_enableModule();
MAP_FPU_enableLazyStacking();

//![单个采样模式配置]
/*初始化 ADC (MCLK/1/4)*/
MAP_ADC14_enableModule();
MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、
0);

/*配置 GPIO (5.5 A0)*/
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、
GPIO_TICE_MODULE_FUNCTION);

/*配置 ADC 内存*/
MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);
MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、
ADC_INPUT_A0、false);

/*配置采样计时器*/
MAP_ADC14_enableSampleTimer (ADC_MANUAL_DEACation);

/*启用/切换转换*/
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger ();
//![单个采样模式配置]

/*启用中断*/
MAP_ADC14_enableInterrupt (ADC_INT0);
MAP_Interrupt_enableInterrupt (INT_ADC14);
MAP_Interrupt_enableMaster();
//lcdupdate();
while (1)
{
MAP_PCM_gotoLPM0 ();
}
}/*

Port1 ISR -
此 ISR 将在按下按钮
时逐步升高 PWM 的占空比*/
void Port1_IRQHandler (void)
{
uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);

IF (STATUS & GPIO_PIN1)
{
if (pwmConfig.dutyCycle = 160)
pwmConfig.dutyCycle = 0;
其他
pwmConfig.dutyCycle += 1;

MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
}
}
//![单个采样结果]/*
ADC 中断处理程序。 每当
ADC_MEM0完成转换*时、就会调用此处理程序。
* 
void ADC14_IRQHandler (void)
{
uint64_t status = MAP_ADC14_getEnabableInterruptStatus();
MAP_ADC14_clearInterruptFlag (status);

IF (ADC_INT0和状态)
{
节拍= 0;
curADCResult = MAP_ADC14_getResult (ADC_MEM0);
curADCResult =(curADCResult * 1650)/(16384);//将2:1 in 与 LCD 电压之比缩放
normalizedADCRes=(uint16_t) curADCResult;//将 ADC 值截断为四位数以显示在 LCD 上
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (四个+ 48个、char1);//传递要显示的 ADC 值
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 100000){ //硬编码 while 循环用于延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); //更新 LCD 屏幕,使其不存储内存
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_TONN();

}
} 
静态空 showChar (char c、int position){uint8_t ii;if (c ='){for (ii = 0;ii < 4;i++){LCD_F->M[position+i]|= 0x00;}否则(c >='0'& c <='9'){i LCD_F<=4+2[ii);}如果(c >M[i+4+i+i=4+i]|xi+i_0<= 0<= 0<= 0<= 0<= 0<=);}、则为[ii);}negoti+2< }否则、如果(c >='a'& c <='Z'){for (ii = 0;ii <4;i++){LCD_F->M[position+i]|= betalphaBig[c-65][ii);}则为{LCD_F->M[位置]= 0xFF;}//单个结果示例! 

/*-版权所有-、BSD *版权所有(c) 2017、德州仪器(TI)公司 *保留所有权利。  * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: *  *源代码的重新分发必须保留上述版权 声明*  、此条件列表和以下免责声明。  * ** *二进制形式的再发行必须在      *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。  * *** 未经      事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。  * *本软件由版权所有者和贡献者"按原样"提供 *、  不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润;  *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。  *--/版权-*//()**************************  * MSP432 Timer_A -可变 PWM * 说明:在此示例中、Timer_A 模块用于创建  具有可调占空比的精密* PWM。 PWM 初始周期为200ms、 *在 P2.4上输出。 PWM 的初始占空比为10%、但是 当按下 P1.1上的*按钮时、占空比会按顺序增加10%。  *一旦占空比达到90%、 按下*次按钮后、占空比将重置为10%。  * *         MSP432P4111 *        ----------  *      /|\|          | *      ||          | *      -|RST      P1.1 |<--切换开关 *       |          | *       |          | *       |       P2.4 |-->输出 PWM *       |          | *       |          | * (小部分 //* DriverLib 包括*/#include
/*标准包括*/#include #include
volatile uint32_t Tick;
void ADC14_IRQHandler (void);void Port1_IRQHandler (void);
#define char1 16  //数字 A1 - L16 #define char2 32  //数字 A2 - L32 #define char3 40  //数字 A3 - L40 #define char4 36  //数字 A4 - L36 #define char5 28  //数字 A5 - L28 #define char6 44  //数字 A6 - L44
const char digit[10][4]={  0xC、0xF、0x8、0x2}、 /*"0" LCD 段 A+b+c+d+e+f+k+q */  {0x0、0x6、0x0、0x2}、 /*"1"*  /{0xB、0x0、0x0、0x7、0x6}    *、  0x7、0x0 */ 0x3 *、  0x0    0xB、0x0、0x0}、 /*"6"*/  {0x4、0xE、0x0、0x0}、 /*"7"*/  {0xF、0xF、0x0、0x0}、 /*"8"*/  {0x7、0xF、0x0、0x0}  /*"9"*};
const char alphaBig[26][4]={  0xF、0xE、0x0、0x0}、 /*"A" LCD 段 A+b+c+e+f+g+m */  {0x1、0xF、0x0、0x5}、 /*"B"*  /{0xC、0x9、0x0、0xF*    、0xF/、0xF*、0x0*、0xF/ 0xF/、0xF/、0xF/、0xF/、0xF/、0xF*         0xB、0x0、0x0}、 /*"G"*/  {0xF、0x6、0x0、0x0}、 /*"H"*/  {0x0、0x9、0x0、0x5}、 /*"I"*  /{0x8、0x7、0x0、0x0、0x0}、 /*"J"*  /{0x2      、 0x6、0xC"、0xC"、0xC/ 0x6、0xC"、0xC/ 0xC/ 0xC/ 0xC"、0xC/ 0xC/ 0xC"   0x2、0x8}、 /*"N"*  /{0xC、0xF、0x0、0x0}、 /*"O"*/  {0xF、0xC、0x0、0x0}、 /*"P"*  /{0xC、0xF、0x2、0x0}、 /*"Q"*/  {0xF、0x7   、0xC"、0x7、0xC"、0x7、0xC/   *、0x7、0x7、0xC"、0xC"、0x7、0xC"、0xB/ 0x7、0xC"    0x0}、 /*"U"*/  {0xC、0x0、0x8、0x2}、 /*"V"*/  {0xC、0x6、0xA、0x0}、 /*"W"*/  {0x0、0x0、0xA、0xA}、 /*"X"*/  {0x0、0x8}     、0xB}、0xB */ 0x9 *
静态易失性浮点 curADCResult;静态易失性 uint16_t normalizedADCRes;静态易失性字符1;//传递到 LCDstatic 易失性字符2;静态易失性字符3;静态易失性字符4;
静态空 showChar (char c、int position);
/* LCD 的配置结构*/LCD_F_Config lcdConf ={  .clockSource = LCD_F_CLOCKSOURCE_ACLK、  .clockDivider = LCD_F_CLOCKDIVIDER_32、  .clockPrescaler = LCD_F_CLOCKPRESCALER_1、  .muxRate = LCD_4  波形、LCD_F_FR_4波形   .Segments = LCD_F_Segs_enabled};

//![Simple Timer_A Config]/* Timer_A PWM 配置参数*/ Timer_A_PWMConfig pwmConfig ={     Timer_A_CLOCKSOURCE_SMCLK、     Timer_A_CLOCKSOURCE_divider _1、     166、//144.5KHz PWM 信号     Timer_A_CAPTURECOMPARE 寄存器_1、     Timer_A_OUTPUTMODE_RESET_SET、     0};//![Simple Timer_A 配置]
void lcdupdate (void){  Tick = 0;  one =(normalizedADCRes % 10);  normalizedADCRes = normalizedADCRes/10;  two =(normalizedADCRes % 10);normalizedADCRes  = normalizedADCRes/10;  three =(showisizedADCRes % 10        );normalizedADCR10 = 4 (normalizedADCR10);normalizedADCR48 (showcharizedADCRes + 4);normalizedADCR48 (showcharizedADCR10);normed ADCR1 + 4 (showcharizedADCR10);   showChar (2 + 48、char3);  showChar (1 + 48、char4);  showChar (''、 char5);  showChar (''、char6);  map_ADC14_toggleConversionTrigger ();  while (Tick < 1000000){ //硬编码延迟     tick++;    }   LCD_F_clearAllMemory ();  LCD_F_setPinAsLCDFunction (LCD_F_Segment 行_0、LCD_F_Segment 行_3);  LCD_F_setPinAsLCDFunction (LCD_F_Segment 行_6);  LCD_F_setPinsAsLCDFunction (LCD_F_16段、行 LCD_F_SEGM_LINE_19);  LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);  LCD_F_setPinAsCOM (LCD_F_SEGMe_LINE_26、LCD_F_MEMORY_COM0);   LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、 LCD_F_MEMORY_COM3);  LCD_F_TONON ();}
int main (void){
  节拍= 0;
/*暂停看门狗*/MAP_WDT_A_HOLDTimer();
/*初始化引脚中的所有功能选择位*/  P3->SEL1 |= 0xF2;  P6->SEL1 |= 0x0C;  P7->SEL1 |= 0xF0;  P8->SEL1 |= 0xFC;  P9->SEL1 |= 0xFF;   P10->SEL1 |= 0x3F;
  /*将 ACLK 设置为基准振荡器*/  CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_1);
  /*初始化 LCD_F 模块*/  LCD_F_initModule (&lcdConf);
  /*清除所有内存*/  lcd_f_clearAllMemory();
  /*初始化我们的所有引脚并设置相关的 COM 线*/  LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3);  LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);LCD_F_setPinsAsLCD_LINE_19  (LCD_LINE_LCD_F_LINE_LCD_LINE_16);LCD_LINE_LCD_LINE_LCD_F_LINE_LCD_LINE_LCD_LINE_   LCD_F_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、 LCD_F_MEMORY_COM1);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);  LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
  /*在*/  LCD_F_TONON ()上使 LCD_F 模块运行;
 ///------------------------------------
  //![Simple Timer_A 示例]  //*将 MCLK 设置为 REFO 为128Khz 以实现 LF 模式   *将 SMCLK 设置为64Khz */  MAP_CS_setDCOenceedFrequency (CS_DCO_FREQUENCY 24);  MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_SC_RESTON_CLK_CLKCLK_CLKCLK_SELECTL、CS_SC_CLUS_CLUS_CLUS_CLUS_CLCK_REDC_CLUS_CLKDC_RESPLUCK_SC     // map_CS_initClockSignal (CS_MCLK、CS_REFOCLK_select、CS_clock_divider);  // map_CS_initClockSignal (CS_SMCLK、CS_REFOCLK_select、 CS_CLOCK 分频器_2);  MAP_PCM_setPowerState (PCM_AM_LF_VCORE0);
  /*将 GPIO2.4配置为 PWM 的外设输出 、将 P6.7配置为按钮   *中断*/  MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、       GPIO_PRIMARY_MODULE_FUNCTION);  MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);  MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);   MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);
  /*将 Timer_A 配置为具有大约500ms 的周期、   *初始占空比为该周期(3200个节拍)的10% */  MAP_Timer_A_generatePWM (timer_A0_BASE、&pwmConfig);  //![简单 Timer_A 示例]
  /*启用中断并启动看门狗计时器*/  MAP_Interrupt_enableInterrupt (INT_Port1);  MAP_Interrupt_enableSlepOnIsrExit ();  MAP_Interrupt_enableMaster ();
  /*不使用时睡眠*/
 ///--------------------------------------------------------------   /*初始化变量*/  curADCResult = 0;
  /*设置闪存等待状态*/  MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);  MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
  /*将 DCO 设置为48MHz */  MAP_PCM_setPowerState (PCM_AM_LDO_VCORE1);  //MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);
  /*为浮点运算启用 FPU */  MAP_FPU_enableModule();  MAP_FPU_enableLazyStacking();
  //![单个采样模式配置]  //初始化 ADC (MCLK/1/4)*/  MAP_ADC14_enableModule ();  MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、       0);
  /*配置 GPIO (5.5 A0)*/  MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、  GPIO_TIVE_MODULE_FUNCTION);
  //配置 ADC 内存*/  MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);  MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、  ADC_INPUT_A0、 false);
  /*配置采样计时器*/  MAP_ADC14_enableSampleTimer (ADC_MANUAL_DIERY);
  /*启用/切换转换*/  MAP_ADC14_enableConversion();  MAP_ADC14_toggleConversionTrigger();  //![单个采样模式配置]
  /*启用中断*/  MAP_ADC14_enableInterrupt (ADC_INT0);  MAP_Interrupt_enableInterrupt (INT_ADC14);  MAP_Interrupt_enableMaster ();  //lcdupdate ();  while (1)  {     MAP_PCM_gotoLPM0 ();  }
/* Port1 ISR - 此 ISR 将逐步升高 PWM 的占空比*按下按钮时 */void Port1_IRQHandler (void){  uint32_t status = MAP_GPIO_getenabledInterruptStatus (GPIO_PORT_P1);  MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、status);
  if (status & GPIO_PIN1)  {     if (pwmConfig.dutyCycle = 160)       pwmConfig.dutyCycle = 0;     其他       pwmConfig.dutyCycle += 1;
    MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);  }// ![单个采样结果]/* ADC 中断处理程序。 每当 ADC_MEM0完成转换*时、就会调用此处理程序。  /void ADC14_IRQHandler (void){  uint64_t status = MAP_ADC14_getEnabableInterruptStatus ();  MAP_ADC14_clearInterruptFlag (status);
  IF (ADC_INT0和状态)  {     节拍= 0;     curADCResult = MAP_ADC14_getResult (ADC_MEM0);     curADCResult =(curADCResult * 1650)/(16384);     normalizedADCRes=(uint16_t) curADCResult;     一=(标准化 ADCRes % 10);     normalizedADCRes= normalizedADCRes/10;     2 =(标准化 ADCRes % 10);     normalizedADCRes= normalizedADCRes/10;     三=(标准化 ADCRes % 10);     normalizedADCRes= normalizedADCRes/10;     四=(标准化 ADCRes % 10);     showChar (4 + 48、char1);     showChar (3 + 48、char2);     showChar (2 + 48、char3);     showChar (一个+ 48个、char4);     showChar (''、char5);     showChar (''、char6);     MAP_ADC14_toggleConversionTrigger ();     while (Tick < 100000){       tick++;      }     LCD_F_clearAllMemory();     LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3);     LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);     LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);     LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);     LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);     LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);     LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);     LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);     LCD_F_TONON ();
    }   
静态空 showChar (char c、int position){  uint8_t ii;  if (c =')  {     对于(ii = 0;ii < 4;ii +)     {       LCD_F->M[position+i]|= 0x00;    }   }  否则、如果(c >="0"&c <="9")  {     对于(ii = 0;ii < 4;ii +)     {       LCD_F->M[position+i]|= digit[c-48][i];    }   }  否则、如果(c >='A'& c <='Z')  {     对于(ii = 0;ii < 4;ii +)     {       LCD_F->M[position+i]|= alphabegi[c-65][i];    }   }否则  {     LCD_F->M[位置]= 0xFF;  }}
//![单个采样结果]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议从计时器触发 ADC、计时器的周期决定采样率。

    dev.ti.com/.../

    您希望以多高的频率更新与采样率相关的显示屏? 您是否希望 LCD 显示每次测量的平均值或一些其他质量的样本结果?

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将研究如何从计时器触发 ADC。 就在它现在的位置,似乎每当我调用 MAP_ADC14_toggleConversionTrigger()函数时,我都会获取另一个样本。 我修改了此代码的 ADC 部分的示例代码、并且在工作原理之外、我很难理解它。 您能否简要解释一下该代码中发生的情况?

    我希望显示屏每隔四分之一秒显示一次每次测量的平均结果。

    很抱歉耽误你的答复。

    最棒的

    授予
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    授予、

      可以在 此处找到 API 定义和说明。  我认为其中一个挑战是了解什么是默认值(未初始化)。  这正是 TRM 的帮助之处。   

    MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、0); 

    此 API 用于设置 ADC 的时钟。  该时钟将根据采样计时器的配置确定转换时间和可能的采样保持时间。  最后的"0"用于设置内部温度或电压传感器、不用于本示例。   

    /*配置 ADC 内存*/
    MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);
    MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、
    ADC_INPUT_A0、false); 

    有几个特定于该模式的 API。  在这种情况下、选择 SingleSampleMode 是因为仅测量一个通道。  "true"意味着将重复测量。  重复频率将由触发源定义、也可以将其配置为在之前的转换完成后自动发生。   

    /*将样本触发器配置为来自 Timer_A0并进行设置
    *在触发后自动迭代*/
    MAP_ADC14_setSampleHoldTrigger (ADC_TRIGGER_SOURCE1、false); 

    触发器只是 ADC 的触发源。  定义可在数据表中找到、但通常情况下、触发器来自计时器源或软件。  "false"与触发器的极性有关、实际上是无关的。   

    未显示的是示例计时器的 API。

    /*配置采样计时器*/
    MAP_ADC14_enableSampleTimer (ADC_MANUAL_DEACation);
    
    MAP_ADC14_setSampleHoldTime (ADC_PULSE_WIDTH_4、ADC_PULSE_WIDTH_8); 

    如果参数 pass 为"手动"、则需要通过软件或计时器进行外部触发。  如果它是自动的、那么 ADC 将在最后一次转换完成后立即开始另一次转换。  最后、如果启用了 SampleTimer、则采样保持时间由 ADC 时钟脉冲数定义、因此实际时间是先前配置的 ADC 时钟和此处定义的脉冲数的函数。  请注意、第一个和第二个参数适用于不同的转换存储器位置、而不是实际的通道本身。   

    此致、
    Chris