工作日记:009项目整改

文章描述了一个与汽车电子控制系统相关的程序,涉及转速控制算法(根据CMD_DUTY值调整齿轮级别和PWM),以及灯亮度调整机制(通过改变扫描次数实现)。同时提到了芯海时钟配置,包括定时器的使能、复位和时钟源选择,以及中断服务函数的执行频率。
摘要由CSDN通过智能技术生成

1、换挡急促

if((CMD_DUTY>=0) && (CMD_DUTY<=5)){
				ucGear_level = 0;
				uiRPMtarget = 0;
				gBitPwmquickflag = 0;
			}
			else{
				switch (CMD_DUTY)
				{
				case 10:
				case 11:
				if(ucGear_level != 1){
					gBitPwmquickflag = 0;
				}
					ucGear_level = 1;
					break;
				case 30:
				case 31:
				if(ucGear_level != 2){
					gBitPwmquickflag = 0;
				}
					gBitPwmquickflag = 0;
					ucGear_level = 2;
					break;
				case 60:
				case 61:
				if(ucGear_level != 3){
					gBitPwmquickflag = 0;
				}
					gBitPwmquickflag = 0;
					ucGear_level = 3;
					break;
				case 80:
				case 81:
				if(ucGear_level != 4){
					gBitPwmquickflag = 0;
				}
					gBitPwmquickflag = 0;
					ucGear_level = 4;
					break;
				case 90:
				case 91:
				if(ucGear_level != 5){
					gBitPwmquickflag = 0;
				}
					gBitPwmquickflag = 0;
					ucGear_level = 5;
					break;
				case 99:
				case 100:
					gBitPwmquickflag = 0;
					if(ucGear_level != 6){
						gAIcnt = 0;
						uiRPMtarget = 1600;
					}
					ucGear_level = 6;
									
					break;
				
				default:
					break;
				}
			}	



void Speedcontrol(void)
{
	static unsigned char cnt = 0;

	if(gBitPwmquickflag == 0){
		cnt++;
		if(cnt < 30){
			return;
		}
		cnt = 0;
	}
	
	if(bSpeedChange == 1)
	{
		uiRPMactual  = 1785700 / uiSpeedTimer;		//7 duiji
		// uiRPMactual  = 2500000 / uiSpeedTimer;	//5 duiji
		bSpeedChange = 0;
	}

	if(uiRPMactual < (uiRPMtarget - 200))
	{
		if(bCurrent_limit == 0)
		{
			if(ucGear_level == 6)//AI dang
				uiPWMDuty_Final +=3;
			else
				uiPWMDuty_Final +=4;
		}
	}
	else if(uiRPMactual < (uiRPMtarget - 50))				
	{
		gBitPwmquickflag = 1;
		if(bCurrent_limit == 0)
		{
			uiPWMDuty_Final ++;
		}
		else
		{
			gDowncnt++;
			if(gDowncnt >= 2){
				gDowncnt = 0;
				uiPWMDuty_Final --;
			}
		}
	}
	else if (uiRPMactual > (uiRPMtarget + 200))
	{
		uiPWMDuty_Final --;
	}
	else if (uiRPMactual > (uiRPMtarget + 50))
	{
		gBitPwmquickflag = 1;
		gDowncnt++;
		if(gDowncnt >= 2){
			gDowncnt = 0;
			uiPWMDuty_Final --;
		}
	}
	

	
	if(uiPWMDuty_Final > uiPWM_MAX)					
	{
		uiPWMDuty_Final = uiPWM_MAX;
	}
	if(uiPWMDuty_Final < uiPWM_MIN)					
	{
		uiPWMDuty_Final = uiPWM_MIN;
	}
	_dutr0h = (unsigned char)(uiPWMDuty_Final >> 8);
	_dutr0l = (unsigned char)uiPWMDuty_Final;
	_pwmsuf = 1;	
}

PWM影响转速,当目标转速离实际转速相差较大时,转速提升就大一点,相差较小时,转速提升就小一点。

提升转速的场景有换挡和按压两种情况,换挡的时候把标志位置起来,然后进入speedcontrol函数里面识别到标志位就需要计时,没有识别到标志位则认为是按压状况,不需要计时器。

2、灯的亮度不同

增加暗的灯的灯光扫描次数,它的频率增加了,灯就变亮了。

同样的,由于暗的灯的扫描次数增加了,总的扫描次数也增加了。

相应的亮的灯扫描次数占的比重就少了,频率也小了,亮度就小了。

疑惑的点:以前挡位灯亮的时候,结合结构看不太出来颜色不均匀,现在挡位灯占的比重少了,颜色越看越不均匀。

3、芯海时钟配置

1、TM0CON寄存器

禁止定时器0--TM0CK/16--使能定时器0复位--时钟源选择CPUCLK

1、CPUCLK

cpuclk是受MCK~MCK/8影响的,它两的指令周期是2000KHz(默认) 

时钟源是2000KHz,然后时钟分频是/16,所以时钟源分频后是125KHz,也就是0.008ms

2、TM0IN

        定时器0的输入为CPUCLK或WDTCLK。在定时器0集成了一个分频器,分频的时钟TM0CLK作为8bits计数器的输入时钟。当用户设置了定时器0模块的使能标志,8bits计数器将启动,将会从00H递增到TM0IN。用户需设置TM0IN(定时器0模块终端信号选择器)以选择定时超时中断信号。当定时超时发生时,中断标志位会自设置,程序计数器会跳转到0004H以执行中断服务程序。

        综上:我设置的TM0IN为25,时钟源分频后为0.008ms一次,所以中断服务函数每0.2ms执行一次。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值