【单片机】【710】逆变

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;

上面是正常工作的按键写法,作用是开关逆变的输出。先回忆一下逆变的配置方法

  1. 各种初始化,CPU,Timer2,ADC,PWM,LCD(如果有显示的话),PR2的值(我的习惯写法,方便改动,在初始化里面可写可不写)
  2. 按键控制,先声明一个unsigned char类型的变量(Key_rec)来接收按键扫描的值,然后用switch在while(1)里面依据接收到的值执行不同的指令。
  3. 配置PWM输出,逆变需要两路来输出,本人用的710(虽手册上写有半桥输出功能,但却无法配置),配置时,OCx里的x就是对应的输出引脚,此时须注意凡是初始化里的语句里带有OCx的指令,x必须要全部和你配置的那个脚对应的x一样。控制占空比的寄存器是OCxRS(PWM输出模式下)。
  4. 添加表格。按你想要输出的频率生成相应的表格,计算方法是先计算多久进一次中断t,然后用你想要频率F的周期T去除以t,得到的就是逆变的点数。最大值不得超过定时器的比较值(PR2的值),所以要注意如果乘倍率的时候最大值不要超过PR2。不然输出是空心的。
  5. 中断输出,最后的一步了。把表格的值一个一个输出去就行了,一般只用到表格的一半的值,为什么,你看代码就知道了
 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的配置文件里关了吧,不然你的单片机过一会就会自动复位了(如果你有开关按键,那么就是给你到关闭状态了)。这是个教训。

时间: 2024-08-28 21:35:56

【单片机】【710】逆变的相关文章

C# - 协变与逆变

public interface IFication<T>{    void Method1 ( T t );    T Method2();} public class Parent : IFication<Parent>{    public string Car="阿斯顿马丁";  // 父亲具有车子 public void Method1 ( Parent p )    {        Console.WriteLine ( p.Car );    }

逆变与协变详解

逆变(contravariant)与协变(covariant)是C#4新增的概念,许多书籍和博客都有讲解,我觉得都没有把它们讲清楚,搞明白了它们,可以更准确地去定义泛型委托和接口,这里我尝试画图详细解析逆变与协变. 变的概念 我们都知道.Net里或者说在OO的世界里,可以安全地把子类的引用赋给父类引用,例如: 1 2 3 //父类 = 子类 string str = "string"; object obj = str;//变了 而C#里又有泛型的概念,泛型是对类型系统的进一步抽象,比

EF中逆变和协变

EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS user = new HKSJ_USERS(); user.LoginName = "ssss"; user.Mail = "ssss"; user.PassWord = "ssss"; user.Plane = "ssss";

协变和逆变

具体可以参考:<Effective Java>PECS 原则 (producser-extends, consumer-super) G[+A]类似一个生产者,提供数据.(大部分情况下称G为容器类型)G[-A] 是一个消费者,主要用来消费数据.(如上的 Equiv[-A] (其实就是个A => Boolean的函数,即Function1[-A, Boolean])) 同理函数的参数为何声明为逆变,返回值为协变就好理解了同理class G[+A]{def fun[B >: A](x:

编写高质量代码改善C#程序的157个建议——建议45:为泛型类型参数指定逆变

建议45:为泛型类型参数指定逆变 逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类.FCL4.0中支持逆变的常用委托有: Func<int T,out TResult> Predicate<in T> 常用委托有: IComparer<in T> 下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { static void Main() { Programmer p = new Programmer { Name = "Mi

Scala 协变 和 逆变

在Scala(以及其他许多编程语言)中,函数也是对象,可以使用.定义其他对象的地方,也可以使用.定义函数.Scala中的函数,具有apply方法的类的实例,就可以当做函数来使用.其中apply接受的参数就是函数的参数,而apply的返回值就是函数的返回值. 首先给出一个接受一个参数的函数的泛型定义. trait Function1[-T, +U] {   def apply(x: T): U } 这种函数接受一个参数,参数类型为泛型类型T,返回类型为泛型类型U.和其他支持泛型的语言一样,实际定义

泛型中协变和逆变

写在前面 今天讲的内容有点多,但是差不多都能听懂,稍微有点模糊的就是协变和逆变的概念,下面是我结合在网上看的资料整合而成的. 正文 msdn上的原话: 协变:是指能够使用比原始指定的派生类型的派生程度更小(不太确定)的类型 逆变:是指能够使用比原始类型的派生类型的派生程度更大(更具体)的类型 在方便理解的概念是: 协变:子类向父类转化,用于返回类型用out关键字 逆变:父类向子类转化的过程,用于方法参数类型用in关键字 协变的例子: 1 public class Person { } 2 3 p

面向对象设计——协变与逆变

在面向对象的设计中,我们一直追求一种结果,就是良好的复用性,基于这个理念,面向对象的设计中加入了协变与逆变(Covariance and Contravariance)两个概念,我们先来简单了解一下这两个概念. 简介: 协变:由子类向父类方向转变, 用out关键字标识 逆变:由父类向子类方向转变, 用in关键字 举例:Animal是父类,Dog是从Animal继承的子类:如果一个对象的类型是Dog,那么他必然是Animal.有一个获取宠物的方法要接受Dog参数,那么另一个接受Animal参数的方

变体(协变与逆变)

变体的引入是为了提高泛型类型的变量在赋值时可以对类型进行兼容性转换,以扩展泛型的灵活性.下面看个例子: public delegate void DoWork<T>(T arg); ........ DoWork<A> del1=delegate(A arg){//.......}; DoWork<B> del2=del1; B bb=new B(); del2(bb); 其中A ,B是两个类,B类继承A类,即:public class A{.....}