void G_Average_Pulse(void)/*ÓÃÓÚÈ¡rpmµÄƽ¾ùÖµ£¬ÒÔÎȶ¨*/ { get_ave_all+=rpm; a=front%Pulse_array_max; get_ave_all-=pulse_arr[a]; rear++; b=rear%Pulse_array_max; pulse_arr[b]=rpm; if(rear<Pulse_array_max) { front--; } front++; rpm_ave=get_ave_all/Pulse_array_max; }优化代码
时间: 2023-11-17 17:06:08 浏览: 72
下面是对代码的优化:
```c
#define PULSE_ARRAY_MAX 10 // 宏定义脉冲数组的最大长度
int pulse_arr[PULSE_ARRAY_MAX]; // 脉冲数组
int front = 0; // 队首指针
int rear = 0; // 队尾指针
int get_ave_all = 0; // 脉冲数组所有元素之和
// 计算脉冲数组的平均值
void G_Average_Pulse(void)
{
get_ave_all += rpm; // 将新的脉冲值加入到脉冲数组的总和中
get_ave_all -= pulse_arr[front]; // 将最早的脉冲值从脉冲数组的总和中减去
pulse_arr[rear] = rpm; // 将新的脉冲值加入到脉冲数组中
rear = (rear + 1) % PULSE_ARRAY_MAX; // 将队尾指针向后移动一位
if (rear == front) // 判断队列是否已满
{
front = (front + 1) % PULSE_ARRAY_MAX; // 将队首指针向后移动一位
}
rpm_ave = get_ave_all / PULSE_ARRAY_MAX; // 计算脉冲数组的平均值
}
```
优化后的代码使用了宏定义,使得代码更加易读易维护。同时,使用了取模运算,将队头和队尾指针的计算封装为一个公式,简化了代码。
相关问题
void PWM_Int(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; //¶¨Òå½á¹¹ÌåGPIO_InitStructure TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //¶¨Òå½á¹¹ÌåTIM_TimeBaseStructure TIM_OCInitTypeDef TIM_OCInitStructure; //¶¨Òå½á¹¹ÌåTIM_OCInitStructure RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ʹÄÜPB¶Ë¿ÚʱÖÓ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//ʹÄܶ¨Ê±Æ÷3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //¸´ÓÃģʽÊä³ö GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //PB0 ¡¢PB1 GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; //IO¿ÚËÙ¶È GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIO³õʼ»¯ TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÏÂÒ»¸ö¸üлµÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷µÄÖµ TIM_TimeBaseStructure.TIM_Prescaler = psc; //Ô¤·ÖÅäÖµ TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ʱÖÓ·Ö¸î TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //ÏòÉϼÆÊý TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1; //PWMÂö³å¿í¶Èµ÷ÖÆ1 TIM_OCInitStructure.TIM_Pulse = 0; //ÉèÖôý×°È벶»ñ±È½Ï¼Ä´æÆ÷µÄÂö³åÖµ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ÉèÖÃTIMÊä³ö¼«ÐÔΪ¸ß TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//±È½ÏÊä³öʹÄÜ TIM_OC3Init(TIM3,&TIM_OCInitStructure); TIM_OC4Init(TIM3,&TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM3,ENABLE);//Ö÷Êä³öʹÄÜ TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//ʹÄÜԤװÔؼĴæÆ÷ TIM_ARRPreloadConfig(TIM3,ENABLE); //ʹÄÜ×Ô¶¯×°ÔØÔÊÐíλ TIM_Cmd(TIM3,ENABLE);//Æô¶¯¶¨Ê±Æ÷3 } void Set_PWMA(int PWM) { TIM_SetCompare3(TIM3,PWM);//ÉèÖÃTIM3ͨµÀ3µÄÕ¼¿Õ±È 3000/7200 } void Set_PWMB(int PWM) { TIM_SetCompare4(TIM3,PWM); 这段代码是一个pwm驱动还是两个pwm驱动欸
这段代码是一个具有两个PWM通道的驱动程序。使用了TIM3定时器和GPIOB引脚的PB0和PB1作为输出。其中,函数`void PWM_Int(u16 arr, u16 psc)`用于初始化PWM的定时器和GPIO引脚,设置PWM的周期和预分频值。而函数`void Set_PWMA(int PWM)`和`void Set_PWMB(int PWM)`则用于设置PWM的占空比,即设置TIM3通道3和通道4的输出值。
int main(void) { const unsigned char *point; u16 i=0; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ // uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú // KEY_Init(); //°´¼ü³õʼ»¯ AT24CXX_Init(); //IIC³õʼ»¯ OLED_init(); point= &picture_tab[0]; TIM_OCInitTypeDef TIM_OCInitStructure; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ TIM3_Int_Init(4999,7199);//10KhzµÄ¼ÆÊýƵÂÊ£¬¼ÆÊýµ½5000Ϊ500ms TIM4_PWM_Init(10000-1,72-1); //72M/72=1MHz¼ÆÊýƵÂÊ,ÖØ×°ÔØÖµ while(1) { OLED_ShowString(0,30,"21221054",16); OLED_ShowString(0,15,"2023/5/18",16); OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); delay_ms(1000); OLED_Refresh_Gram(); //¸üÐÂÏÔʾµ½OLED if(++i > 3) { LED1=!LED1;//ÌáʾϵͳÕýÔÚÔËÐÐ i=0; } while(1) { u16 u16tmp; u16tmp += 500; if(u16tmp > 10000) u16tmp=0; //³õʼ»¯TIM4 Channe3 PWMģʽ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Ñ¡Ôñ¶¨Ê±Æ÷ģʽ:TIMÂö³å¿í¶Èµ÷ÖÆģʽ2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±È½ÏÊä³öʹÄÜ TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //Êä³ö¼«ÐÔ:TIMÊä³ö±È½Ï¼«ÐÔ¸ß TIM_OCInitStructure.TIM_Pulse = u16tmp; TIM_OC3Init(TIM4, &TIM_OCInitStructure); //¸ù¾ÝTÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèTIM4 OC3 LED2=!LED2; //LED3=!LED3; delay_ms(300); } } }这段代码问题如下:declaration may not appear after executable statement inblock,TIM OCINITTYPEDEF TIM OCINITSTRUCTURE,请修改这个问题
这个错误是因为在 `while` 循环中,变量 `TIM_OCInitStructure` 的声明出现在了可执行语句之后。这是不允许的,因为C语言规定变量声明必须在可执行语句之前。
要解决这个问题,你需要将变量 `TIM_OCInitStructure` 的声明语句移到可执行语句之前,或者将可执行语句移到声明语句之后。例如:
```
while(1)
{
TIM_OCInitTypeDef TIM_OCInitStructure; // 变量声明放在可执行语句之前
u16 u16tmp;
u16tmp += 500;
if(u16tmp > 10000) u16tmp=0;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_Pulse = u16tmp;
TIM_OC3Init(TIM4, &TIM_OCInitStructure);
LED2=!LED2;
delay_ms(300);
}
```
另外,你的代码中有一些重复的语句,比如 `delay_init()` 和 `NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)`,可以将它们删除掉。
阅读全文