void ozone_PWM_set(uint16_t frq,uint16_t duty) { uint32_t percent; uint16_t u16_temp; float f_percent,f_T2PR; if(duty>DUTY_RANGE)duty=DUTY_RANGE; //calc duty///////// u16_temp=1000000/frq-1; f_T2PR=4*(u16_temp+1)/100.0; f_percent=duty*f_T2PR; // if(T2PR_value==0) // { // delay(1); // } // else // { // delay(1); // } //f_percent=duty*7.68; /////////////////// percent=(uint32_t)f_percent; //half adjust if((percent%10)>=5) { percent+=10; } percent/=10; /* percent=duty; percent=768*percent/10; //half adjust if((percent%10)>=5) { percent+=10; } percent/=10; */ CCPR1L=percent & 0xff; CCPR1H=(percent>>8) &0x03; }
时间: 2024-01-04 20:04:13 浏览: 95
这段代码是一个函数定义,名为`ozone_PWM_set`,接受两个参数`frq`和`duty`,都是无符号16位整数类型。该函数用于设置PWM(脉宽调制)的频率和占空比。
首先,函数会检查`duty`是否超出了定义的范围`DUTY_RANGE`,如果超出,则将其限制在范围内。
然后,函数计算占空比的值。首先,根据给定的频率`frq`计算出一个临时值`u16_temp`,然后使用这个临时值计算出一个浮点数`f_T2PR`。接下来,将占空比乘以浮点数`f_T2PR`,得到一个浮点数`f_percent`。
然后,将浮点数`f_percent`转换成无符号32位整数类型`percent`。
接下来,对`percent`进行半调整(half adjust)处理。如果`percent`的个位数大于等于5,则十位数加1。最后,将`percent`除以10得到最终的占空比值。
最后,将占空比的低8位赋值给寄存器CCPR1L,将占空比的高2位赋值给寄存器CCPR1H。
注释部分的代码是对T2PR_value是否为0进行判断,并进行相应的延时操作,但是这部分代码被注释掉了。
相关问题
uint32_t ozone_oneCycleSample(void) { uint32_t sum=0,samples=100; uint16_t pre_adc_value,AD_value; int16_t diff; int16_t k; uint16_t adc_min,adc_max; double db_temp; while(TMR6!=100 && !i2c_rec_end); //if i2c recieved i2c data,quite synchronization //while(TMR6!=100); //if i2c recieved i2c data,quite synchronization cnt_10ms=0; pre_adc_value=0; //memset(&buff[0],0,1000); //GIE=0; adc_min=0xffff; adc_max=0; // LATA2=1; for(samples=0;cnt_10ms<2;) //for(samples_n=0;samples_n<1000;samples_n++) { AD_value=adc_oneSample(); diff=AD_value-pre_adc_value; if(diff>3 || diff<-3) { if(samples!=0) { sum+=pre_adc_value; samples++; } } else { sum+=AD_value; samples++; } pre_adc_value=AD_value; if(adc_max<AD_value)adc_max=AD_value; if(adc_min>AD_value)adc_min=AD_value; if(samples>250 && i2c_rec_end)break; } //rms // db_temp=adc_max-adc_min; // db_temp=db_temp*0.423; // sum=adc_min+db_temp; // samples=1; //mean if(samples==0)samples=1; sum=sum/samples; //GIE=1; // LATA2=0; return sum; }
这段代码是一个函数定义,名为`ozone_oneCycleSample`,返回一个无符号32位整数类型的值。
函数首先声明了一些变量,包括`sum`、`samples`、`pre_adc_value`、`AD_value`、`diff`、`k`、`adc_min`、`adc_max`和`db_temp`。
然后,在一个循环中,函数等待计时器TMR6的值为100,并且`i2c_rec_end`为假。这是为了在接收到I2C数据时,确保与I2C数据同步。
接下来,将变量`cnt_10ms`的值设置为0,将变量`pre_adc_value`的值设置为0。
然后,初始化变量`adc_min`为最大可能值0xffff,初始化变量`adc_max`为0。
接下来,进入一个循环,循环条件是在计时器TMR6的值小于100并且变量`cnt_10ms`小于2的情况下。在循环中,首先调用函数`adc_oneSample()`获取一个ADC采样值,并将其保存在变量`AD_value`中。
然后,计算变量`diff`的值,即当前采样值与上一次采样值之间的差异。
接下来,根据差异的大小判断是否需要将当前采样值加入到求和变量`sum`中。如果差异大于3或小于-3,则将上一次的采样值加入到`sum`中;否则,将当前的采样值加入到`sum`中。
每次更新完`sum`后,将当前采样值保存到`pre_adc_value`中,并更新最大值`adc_max`和最小值`adc_min`。
在循环中,如果`samples`大于250并且`i2c_rec_end`为真,则跳出循环。
接下来,计算均值。如果`samples`为0,则将`samples`设置为1,以避免除以0的错误。然后,将`sum`除以`samples`得到均值。
最后,返回均值`sum`作为函数的结果。
webssh ozone_platform_x11.cc(239)] missing x server or $display
这个错误信息出现在WebSSH中的ozone_platform_x11.cc文件的第239行,并提示缺少X Server或$display。X Server是一个用于显示图形界面的软件,而$display是一个环境变量,用于指定当前正在使用的显示设备。
这个错误通常出现在尝试使用WebSSH时,由于缺少X Server或者未正确设置$display变量,导致无法显示图形界面。解决这个问题可以按照以下步骤进行:
1. 确保已经安装X Server:在Linux系统中,可以通过包管理器安装X Server,如使用apt-get命令安装Xorg软件包;在Windows系统中,可以使用Xming或VcXSrv等软件安装X Server。安装完成后,重新启动系统。
2. 配置$display环境变量:对于Linux系统,可以在终端中使用export命令设置$display变量,如export DISPLAY=:0;对于Windows系统,可以在系统环境变量中添加DISPLAY变量,并设置其值为localhost:0。
3. 检查X Server运行状态:在终端中输入命令xhost,确认X Server是否在运行状态。如果未运行,则输入命令startx以启动X Server。
4. 检查WebSSH配置:检查WebSSH的配置文件中是否正确设置了XServer和$display变量。可以尝试重新配置WebSSH,确保相关配置正确。
通过以上步骤,应该能够解决WebSSH中出现的缺少X Server或$display的问题。如果问题仍然存在,可以进一步查阅官方文档或寻求WebSSH技术支持。
阅读全文