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.
工具/软件:Code Composer Studio
我是否可以生成频率为1MHz且10 % 占空比为的信号?
我使用了几种模式来尝试生成此信号,但即使时钟为48Mhz,我也无法达到1MHz频率。
我能达到的最大目标是113khz。
我们非常感谢您的帮助。 谢谢你!
您好,Amit:
这是我尝试使工作的代码(例如:cs_hfxt_start_MSP_EXP432P401R_nortos_CCS)。
/* DriverLib包括*/ #include <ti/devices/msp432p4xx/driverlib/driverlib.h>/* Standard包括*/ #include <stdint.h> #include <stdbool.h> int main(void){ /*停止监视程序*/ MAP_WDT_A_HoldTimer(); //![简单CS配置] /*配置用于外围设备/晶体使用的引脚和用于输出的LED */ MAP_GPIO设置外围模块功能输出引脚(GPIO_PORT_PJ, GPIO _PIN3 | GPIO _PIN2,GPIO主要模块功能); MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0); /*以防用户想要使用getACLK,getMCLK等函数, *让我们在代码中设置时钟频率。 */ cs_setExternalClockSourceFrequency(320.0048万000000);</s>0万 /*在无超时的非旁路模式下启动HFXT。 开始之前 *我们必须将VCORE更改为1才能支持48MHz频率*/ MAP_PCM_setCoreVoltageLevel (PCM_VCORE1); MAP_FlashCTL_setWaitState(FLASH_BANK0, 2); MAP_FlashCTL_setWaitState(FLASH_Bank1,2); cs_startHFXT (FALSE); /*初始化MCLK到HFXT (有效值为48MHz)*/ MAP_CS_initClockSignal (CS_MCLK,CS_HFXTCLK_SELECT,CS_CLock_diver_1); //![简单CS配置] /*配置Systick在1200万时触发(MCLK为48MHz,因此这将会 *每0.25秒切换一次)*/ MAP_Systick_enableModule(); MAP_Systick_setPeriod (1200万); MAP_Interrupt_enableSleepOnIsrExit(); MAP_Systick_enableInterrupe(); /*启用主中断*/ MAP_Interrupt_enableMaster(); 同时(1) { MAP_PCM_GotoLPM0(); } } 作废Systick_Handler(void){ MAP_GPIO_toggleOutputOnPin (GPIO_PORT_P1, GPIO_PIN0); }
我只是改变时钟和周期,这样我就可以产生一个频率更高的方波,但我不能。
我已经通过以下几个示例完成了此测试:
Timer_a_PWM_MODE_MSP_EXP432P401R_nortos_CCS
Timer_a_updown比较多重PWM_MSP_EXP432P401R_nortos_CCS
Timer_a_continuous VLO_period_capture _MSP_EXP432P401R_nortos_CCS
它们都不能使其产生大于520khz的方波信号。
我认为运行在48Mhz处理器上的MSP432P401R应该能够生成频率更高的方波,而不会有任何困难。 但我不能。
您好,
我使用了代码TIMER_A_PWM_MODE_MSP_EXP432P401R_NOTOS_CCS示例,更新了48MHz时钟的系统文件,并从TIMER_A_PWM_MODE.c文件中注释了低频时钟选择,我获得了985 KHz PWM输出。
[Quote user="will A. D.">让我们来看看我需要的:我想以 MSP432P401R 能够达到的最高频率生成连续中断。 到目前为止,我只达到了500kHz,这是每2秒中断一次(微秒),这对于我的项目来说是非常缓慢的。
您是否知道我应该怎么做?[/QUOT]
您很可能会重新思考整个概念。
在48MHz CPU上,不能进行大于每秒100万次的IRQ调用,这是不可能的。 对于48MHz CPU,每秒1MHz中断意味着每个中断48个CPU周期。 如果您不确定48个CPU周期不足以执行任何有意义的操作,特别是使用IRQ -请参阅ARM文档。 它在他们的网站上。
另一种方法是问-您真的需要中断*每个*周期吗? 您真的需要中断吗? 可能轮询模式对于regulation (?)是可以的 或您的ISR将执行的任何操作。 您正在构建什么?
"如果有人能更好地解释这个中断频率的问题。"
只有当使用中断是正确的路径时,这才有价值。 我认为你已经做了足够的工作,可以说不是这样。
"我有什么方法可以每秒生成比我已经拥有的更多的中断?"
是-您可以更频繁地调用中断。
"我对大会的语言非常熟悉,但这对我现在没有多大帮助!"
该芯片不关心您是以组装还是任何其他语言进行编码。如果有任何问题,由合格的编程人员进行组装,可以更高效地提供最终结果。
将,
您需要查看 此帖子,了解有关使用计时器生成可变相位PWM 输出的信息。 这表明您可以使用TimerA模块在0 100 % 范围内创建占空比,但您无法控制两条边线上的第二个PWM的相位偏移。 这主要是因为1)计时器溢出或重置计数事件必须涉及给定计时器的所有捕获/比较(CCUx)输出的一个边缘,并且因为2)计时器之间没有同步机制以这种方式处理相位偏移。 有关详细信息,请参阅另一篇文章。
此致,
Bob L.
您是否检查了硬件PWM的选项? 无法实现您想要的目标? 我不认为软件PWM在给定频率下是个好主意。 最高可达几千赫,很好。 毕竟您有带PW msupport的计时器,为什么不使用它们?
Ilmars,您好!
是的,我选中了,但我无法得到我想要的,因为PWM支持不允许同步输出之间的延迟,所以我开始寻找一个新的拓扑,Bob告诉我这样做。
但有了MSP432P401R,我能够生成多达6个PWM,频率可选,分辨率10MHz,占空比和两者之间的延迟,并通过UART通信接收到完美的同步。 一切都经过测试和工作,但我只能达到0.0001 Hz到2万 Hz的频率,我需要达到100kHz的频率。 所以我用这款IC完成了工作。 最初,我们将处理此项目本身。 但从现在开始,我们将获得一个具有更多PWM资源的IC的开发套件。
因此,此帖子已发布为已解决。
如果有人对此项目感兴趣,请遵循代码。
/* MSP432 UART -具有48MHz BRCLK的PC回波 * 说明:此演示将回波通过PC串行端口接收的字符。 * SMCLK/DCO用作时钟源,设备置于LPM0 * eUSCI使用自动时钟启用功能,SMCLK关闭 *当UART空闲时,当检测到接收边缘时打开。 *请注意,在RS232和MSP *电压电平之间切换时需要电平转换器硬件。 * ** MSP432P401 * -------- * | | * | WFP 1.1 |<---切换开关 * | WFP 2.6 |---->输出PWM1 * RST -| WFP 2.4 |---->输出PWM2 * | | * | WFP (1.3)/UCA0TXD|----> PC (ECHO) * | WFP 1.2 PC* | | * */ * DriverLib包括*/ #包括<ti/devices/msp432p4xx/driverlib/driverlib.h>/* 标准包括*/ #include <stdint.h> #include <stdbool.h>//!*********** [Simple UART Config]*********************** /* UART配置参数。 这些配置参数 *使eUSCI成为UART模块,以9600波特率运行。 这些 *值是使用TI提供 的在线计算器*计算得出的: *software-dl.ti.com/.../index.html */ const eUSI_UART_Config uartConfig ={ EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK时钟源 312 // BRDIV = 13 8, // UCxBRF = 0 0, // UCXBRS = 37 EUSCI_A_UART_NO_PARity, //不奇偶校验 EUSCI_A_UART_LSB First, // LSB优先 EUSCI_A_UART_ON_STOP_BIT, //一个停止位 EUSCI_A_UART_MODE, // UART模式 EUSCI_A_UART_ORTS_OAUDRAT_generation // Oversampling };//!*********** [Simple UART Config]*********************** // Declaração ó n de Operadores Globais char matriz1[7]={0},0,0,0,0, 0,0}; int index_UART = 0; int pwm1[10]={0,0,0,0,0, 0,0,0,0,0}; int index_calculation1 = 0; int index_pwm1 = 0; INT laststatusOUT1 = 0; int pwm2]={0,0,0,0,0, 0,0,0,0,0}; int index_calculation2 = 0; int index_pwm2 = 0; int laststatusOUT2 = 0; int updated_aurt = 0; Int finish = 0; Int精度= 0; Int offset = 0; //valor do offset Int offset_after = 0; //valor do offset para cálculo Int dutycycle = 0; //valor执行占空比 Int dutycycle_after = 0;//valor do Duty cycle para cálculo 浮点周期= 0; //valor do período 浮子阀1 = 0; //XX00,00 = Valor do milhar e da centena 浮动阀2 = 0; //00xx,00 = Valor da dezena e da Unidade 浮动阀3 = 0; //0000,XX = Valor dos decimais 浮点频率= 0; //valor da frequência int main (void){ /*正在停止WDT */ MAP_WDT_A_HoldTimer(); /*配置GPIO */ MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0); MAP_GPIO_setOutputLowOnPin (GPIO端口P1,GPIO _PIN0); /*在UART模式下选择WFP 1.2 和WFP 1.3 */ MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P1, GPIO _PIN1 | GPIO _PIN2 | GPIO _PIN3,GPIO主要模块功能); //![简单CS配置] /*配置用于外围设备/晶体使用的引脚和用于输出的LED */ MAP_GPIO设置外围模块功能输出引脚(GPIO_PORT_PJ, GPIO _PIN3 | GPIO _PIN2,GPIO主要模块功能); /*以防用户想要使用getACLK,getMCLK等函数, *让我们在代码中设置时钟频率。 */ cs_setExternalClockSourceFrequency(48万00,48000000);</s>0.048万 0万 /*在无超时的非旁路模式下启动HFXT。 开始之前 *我们必须将VCORE更改为1才能支持48MHz频率*/ MAP_PCM_setCoreVoltageLevel (PCM_VCORE1); MAP_FlashCTL_setWaitState(FLASH_BANK0, 2); MAP_FlashCTL_setWaitState(FLASH_Bank1,2); cs_startHFXT (FALSE); /*初始化MCLK到HFXT (有效值为48MHz)*/ MAP_CS_initClockSignal (CS_MCLK,CS_HFXTCLK_SELECT,CS_CLock_diver_1); //![简单CS配置] /*在周期模式下配置MCLK的Timer32至12.8万 (1s)*/ MAP_Timer32_initModule (TIMER32_BASE,TIMER32_prescaler_1,TIMER32_32bit, TIMER32_Periodic_mode); //将2.4 的外围输出配置为PWM,将WFP的1.1 配置为按钮 //*中断 //输出 MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN0); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN0); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO PIN1); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN1); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN2); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN2); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN3); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN3); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN4); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN4); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN5); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN5); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN6); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN6); MAP_GPIO_setAsOutputPin (GPIO端口P2,GPIO _PIN7); MAP_GPIO_setOutputLowOnPin (GPIO端口P2,GPIO _PIN7); //输入 MAP_GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1, GPIO_PIN1); MAP_GPIO清除InterruptFlag (GPIO端口P1,GPIO PIN1); MAP_GPIO_enableInterrupt (GPIO端口_P1,GPIO _PIN1); //![简单UART示例] /*配置UART模块*/ MAP_UART_INITModule (EUSCI_A0_BASE,&uartConfig); /*启用UART模块*/ MAP_UART_enableModule (EUSCI_A0_BASE); /*启用中断*/ MAP_UART_enableInterrupt (EUSCI_A0_BASE,EUSCI_A_UART_receive中断); MAP_Interrupt_enableInterrupt (INT_EUSCIA0); //permite a Inicialização da interrupção da Comunicação UART MAP_Interrupt_enableInterrupt (INT_Port1); MAP_Timer32_setCount (TIMER32_BASE,句点); MAP_Timer32_enableInterrupt (TIMER32_BASE); MAP_Interrupt_enableInterrupt (INT_T32_INT1); MAP_Timer32_startTimer (TIMER32_BASE,FALSE); MAP_Interrupt_enableMaster(); MAP_Timer32_setCount (TIMER32_BASE,句点); MAP_Timer32_enableInterrupt (TIMER32_BASE); MAP_Timer32_startTimer (TIMER32_BASE,FALSE); /*启动Timer_A1 */ MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE); while (true)(对) //Rotina主体 { 如果(updated_aurt == 1) { pwm1[0]=0; pwm1[1]= 0; pwm1[2]= 0; pwm1[3]= 0; pwm1[4]=0; pwm1[5]= 0; pwm1[6]= 0; pwm1[7]= 0; pwm1[8]= 0; pwm1[9]= 0; pwm2 [0]=0; pwm2 [1]=0; pwm2[2]= 0; pwm2 [3]= 0; pwm2 [4]=0; pwm2 [5]=0; pwm2 [6]= 0; pwm2 [7]= 0; pwm2 [8]= 0; pwm2 [9]= 0; valor1 = matriz1[1]; valor2 = matriz1[2]; valor3 = matriz1[3]; 精度= matriz1[6]; offset = matriz1[4]; offset_after = matriz1 [4]; dutycycle = matriz1[5]; dutycycle_after = matriz1 [5]; 频率=(((valor1*0x2710)+(valor2*0x64)+valor3)/0x64); 句点=(0x2DC6C00/(freq*0xA))* 0.100万 ; while (offset_after!= 0) { offset_after = offset_after - 0xA; index_calculation2 = index_calculation2 + 1; } pwm2[index_calculation2]= 1; index_calculation2 = index_calculation2 + 1; pwm1[index_calculation1]= 1; index_calculation1 = index_calculation1 + 1; while (dutycycle_after !=0) { dutycycle_after = dutycycle_after - 0xA; pwm1[index_calculation1]= 1; index_calculation1 = index_calculation1 + 1; pwm2[index_calculation2]= 1; index_calculation2 = index_calculation2 + 1; } index_calculation1 = 0; index_calculation2 = 0; MAP_Timer32_setCount (TIMER32_BASE,句点); updated_aurt = 0; } } } 作废Port1_IRQHandler(void) // Interrupção ó n de acionamento da Chave WFP 1.1 { UINT32_t状态= MAP_GPIO _getEnabledInterruptStatus (GPIO端口P1); MAP_GPIO清除InterruptFlag (GPIO端口P1,状态); MAP_UART_S数据(EUSI_A0_base, 0xff); }/* ESCI A0 UART ISR -将数据回波到PC主机*/ void EUSIC0_IRQHandler(void) // Interrupção acionada quando recebe valor em "map_UART_receiveData(EUSSCI_A0_base)" { UINT32_t status = MAP_UART_getEnabledInterruptStatus(EUSI_A0_base);//Gera UMA variável本地chamada状态队列接收1 quando A interrupção foi chamana UINT32_t TXdata = 0x00; //Gera UMA variável本地chamada TXdata que接收为0 TXDATA = MAP_UART_receiveData(EUSSCI_A0_base); //Coloca o dado recebido da Comunicação UART pelo "map_UART_receiveData(EUSI_A0_base) em TXdata" MAP_UART_CLEARInterruptFlag (EUSCI_A0_BASE,状态); //Limpa o status flag da interrupção IF (状态和EUSCI_A_UART_receive中断标志) //选择一个variável本地"状态" e状态标志(EUSCI_A_UART_receive中断标志)= 1 { //se verdadeiro IF (TXdata == 0xAA) { index_UART = 1; } 否则 { IF (TXdata == 0x55) { MAP_UART_ESDLData(EUSI_A0_base, 0xff); index_UART = 0; updated_aurt = 1; } 否则 { IF (TXdata == 0x5F) { MAP_UART_TEXData (EUSCI_A0_BASE,0xAA); index_UART = 0; updated_aurt = 1; } 否则 { IF (index_UART == 1) { matriz1 [1]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); index_UART = 2; } 否则 { IF (index_UART == 2) { matriz1 [2]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); index_UART = 3; } 否则 { IF (index_UART == 3) { matriz1 [3]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); index_UART = 4; } 否则 { IF (index_UART == 4) { matriz1 [4]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); index_UART =5; } 否则 { IF (index_UART == 5) { matriz1 [5]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); index_UART = 6; } 否则 { IF (index_UART == 6) { matriz1 [6]= TXdata; MAP_UART_TXData(EUSI_A0_base, TXdata); } } } } } } } } } }//****************************************************************************************************** //// 这是TIMERA中断矢量服务例程。 ////************************************************************************************************ void T32_INT1_IRQHandler (void) { int OUT1 = pwm1[index_pwm1+]; int OUT2 = pwm2[index_pwm2+]; IF (OUT1) { IF (OUT2) { IF (laststatusOUT1) { IF (laststatusOUT2) { } 否则 { GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT2 =真; } } 否则 { IF (laststatusOUT2) { GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7); laststatusOUT1 =真; } 否则 { GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7 + GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT1 =真; laststatusOUT2 =真; } } } 否则 { IF (laststatusOUT1) { IF (laststatusOUT2) { GPIO _setOutputLowOnPin (GPIO端口P2,GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT2 = false; } 否则 { } } 否则 { IF (laststatusOUT2) { GPIO _ToggleOutputOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7 + GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT1 =真; laststatusOUT2 = false; } 否则 { GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7); laststatusOUT1 =真; } } } } 否则 { IF (OUT2) { IF (laststatusOUT1) { IF (laststatusOUT2) { GPIO _setOutputLowOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7); laststatusOUT1 = false; } 否则 { GPIO _ToggleOutputOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7 + GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT1 = FALSE; laststatusOUT2 =真; } } 否则 { IF (laststatusOUT2) { } 否则 { GPIO _setOutputHighOnPin (GPIO端口P2,GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT2 =真; } } } 否则 { IF (laststatusOUT1) { IF (laststatusOUT2) { GPIO _setOutputLowOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7 + GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT1 = FALSE; laststatusOUT2 = false; } 否则 { GPIO _setOutputLowOnPin (GPIO端口P2,GPIO _PIN6 + GPIO _PIN3 + GPIO _PIN5 + GPIO _PIN7); laststatusOUT1 = false; } } 否则 { IF (laststatusOUT2) { GPIO _setOutputLowOnPin (GPIO端口P2,GPIO _PIN4 + GPIO _PIN1 + GPIO _PIN0 + GPIO _PIN2); laststatusOUT2 = false; } 否则 { } } } } IF (index_pwm1 >= 10) { index_pwm1 = 0; } 否则 { } IF (index_pwm2 >= 10) { index_pwm2 = 0; } 否则 { } MAP_Timer32_clearInterruptFlag(TIMER32_base); }
要触发输出,只需将UART通信发送到以下序列:
非常感谢所有人的帮助! 这对我来说非常有价值。