extern u16 TIM5CH1_CAPTURE_duty; extern u16 temp ; int main(void) { u32 duty=0; float dutys=0.0; float phase=0.0; double pow=0.0; u32 b[5]; delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 LCD_Init(); TIM5_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 while(1) { delay_ms(10); duty=TIM5CH1_CAPTURE_duty; // LCD_ShowxNum(30,90,temp,2,16,0); // LCD_ShowxNum(60,90,duty,2,16,0); dutys=(float)temp/(float)duty; phase=360*(dutys*1.0); b[0]= (phase*10)/10; b[1]= (u32)(phase*10)%10; LCD_ShowStrings(30,120,200,32,32 , "456"); LCD_ShowString(90,120,200,16,16 , ":"); LCD_ShowxNum(100,120,b[0],3,16,0); LCD_ShowxNum(140,120,b[1],2,16,0); LCD_ShowString(130,120,200,16,16 , "."); pow=cos((phase*3.1415926)/180); LCD_ShowxNum(100,140,b[0],3,16,0); // delay_ms(1000); } }
时间: 2024-04-09 15:31:29 浏览: 126
这段代码是一个简单的STM32单片机程序,主要功能是通过TIM5定时器捕获通道1的脉冲宽度,并计算出相位和幅值,并在LCD上显示出来。下面是对代码的解释:
1. 首先,定义了两个全局变量`TIM5CH1_CAPTURE_duty`和`temp`,用于存储捕获的脉冲宽度和临时变量。
2. `main()`函数中,进行了一些初始化操作,如延时函数初始化、中断配置、串口初始化、LED端口初始化和LCD初始化。
3. 调用`TIM5_Cap_Init()`函数初始化TIM5定时器,设置计数器的溢出值为0xFFFF,时钟频率为1MHz。
4. 进入主循环`while(1)`,其中先延时10毫秒。
5. 通过`TIM5CH1_CAPTURE_duty`获取捕获的脉冲宽度,并将其赋值给局部变量`duty`。
6. 计算相位和幅值:将捕获的脉冲宽度转换成占空比,然后乘以360得到相位角度。接着将相位角度转换成整型数,并将整数部分和小数部分分别存储到数组`b`中。
7. 在LCD上显示相位和幅值:使用LCD_ShowStrings()和LCD_ShowString()函数显示字符串和字符,然后使用LCD_ShowxNum()函数显示整数。
8. 最后,通过计算余弦函数得到幅值,并将整数部分显示在LCD上。
这段代码主要是用来演示如何使用STM32定时器和LCD模块进行脉冲宽度的捕获和显示。具体的功能和实现可能会依赖于其他的库函数和硬件配置,所以需要确保相关的函数和硬件配置正确并且可用。
阅读全文