20170322
1 Key_Receive = KeyScan(); 2 switch(Key_Receive){ //按下RE0(93脚)来控制开关 3 case 1: 4 // PR2 = 2000; //载波20KHz 5 OC1CONbits.OCM = 0b110; 6 OC2CONbits.OCM = 0b110; 7 DISPLAY_stri(0,0," "); 8 DISPLAY_stri(0,0,"ON"); 9 Key = ~Key; 10 if(Key == 0){ 11 OC1CONbits.OCM = 0b000; 12 OC2CONbits.OCM = 0b000; 13 OC1RS = 0; 14 OC2RS = 0; 15 DISPLAY_stri(0,0," "); 16 DISPLAY_stri(0,0,"OFF"); 17 } 18 break;
上面是正常工作的按键写法,作用是开关逆变的输出。先回忆一下逆变的配置方法
- 各种初始化,CPU,Timer2,ADC,PWM,LCD(如果有显示的话),PR2的值(我的习惯写法,方便改动,在初始化里面可写可不写)
- 按键控制,先声明一个unsigned char类型的变量(Key_rec)来接收按键扫描的值,然后用switch在while(1)里面依据接收到的值执行不同的指令。
- 配置PWM输出,逆变需要两路来输出,本人用的710(虽手册上写有半桥输出功能,但却无法配置),配置时,OCx里的x就是对应的输出引脚,此时须注意凡是初始化里的语句里带有OCx的指令,x必须要全部和你配置的那个脚对应的x一样。控制占空比的寄存器是OCxRS(PWM输出模式下)。
- 添加表格。按你想要输出的频率生成相应的表格,计算方法是先计算多久进一次中断t,然后用你想要频率F的周期T去除以t,得到的就是逆变的点数。最大值不得超过定时器的比较值(PR2的值),所以要注意如果乘倍率的时候最大值不要超过PR2。不然输出是空心的。
- 中断输出,最后的一步了。把表格的值一个一个输出去就行了,一般只用到表格的一半的值,为什么,你看代码就知道了
1 void __attribute__((__interrupt__, __shadow__)) _T2Interrupt(void) { 2 3 if (p < 200) { //50Hz 4 OC1RS = rate*Count4[p]; 5 OC2RS = 0; 6 } 7 if (p >=200) { 8 OC1RS = 0; 9 OC2RS = rate*Count4[p-200]; 10 } 11 p++; 12 if (p >= 400) 13 p = 0; 14 IFS0bits.T2IF=0; 15 }
最后要提醒,一定要注意看门狗有没有关,这里用不到看门狗。所以去CPU的配置文件里关了吧,不然你的单片机过一会就会自动复位了(如果你有开关按键,那么就是给你到关闭状态了)。这是个教训。