STM32L010でPWMの測定を作てみた。


x mbed2のリビジョン143

目的
シェフの気まぐれ
内部タイマーを使いusでオン時間を測る
シリアル出力

結果

忙しい人よう

あんまり意味がないが 高速化と高精度化


#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//1000の割り算 だいたい正しい
#define DVI1000(n) ((n>>10)+(((n>>10)*32)>>10))

#define HIGH 1
DigitalIn in1(PA_1);

DigitalOut led1(PA_4); //debug

RawSerial pc(PA_2, PA_3); //010 tx, rx

//タイマーの設定
Timer t;

//in1のオン時間をusで測る 今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{
    t.reset();

    //while(in1 != 0) {}

    loop_ins:
    //                      1234567890123456
    if (   (GPIOA->IDR) & 0b0000000000000010   ) { goto loop_ins;}

    //while(in1 == 0) {}

    loop_s1:
    //                            1234567890123456
    if (     (~(GPIOA->IDR))  & 0b0000000000000010    ) { goto loop_s1;}

    //led1 = 1;//debug

    int sd = t.read_us();


    //while(in1 != 0) {}

    loop_in1:
    //                      1234567890123456
    if (   (GPIOA->IDR) & 0b0000000000000010   ) { goto loop_in1;}

    //led1 = 0;//debug

    return(t.read_us()-sd);

}//pulseIn

int main() {

    t.start(); //pulseInで必要

    int pwmco2; //onの間隔 us

    //無限ループ
    while(1){

        //PWMでデータ取得
        pwmco2=pulseIn(7 ,HIGH,2000000);
        //pwmco2=82000; //debug
        printf("The time taken was %d seconds\r\n", pwmco2  );
        printf("The time taken was %d seconds\r\n", DVI1000(pwmco2)  );

        //0.1秒待つ
        wait_ms(100);

    }//while

}//main



テストプログラム



#include "mbed.h"

//周波数の設定 400ppm = 5000×(82ms-2ms)/1000ms
#define XHZ_A (1004*1000)
#define XHZ_B ((80+2)*1000)

//PWMのピンの設定
PwmOut servo(A4); //PA_5   //010

//debug
DigitalOut myled(PA_4);

int main() {

    //周期の設定        
    servo.period_us(XHZ_A);

    //間隔の設定
    servo.pulsewidth_us(XHZ_B);

    while(1) {

        myled = 1;  
        //250ミリ秒まつ
        wait_ms(250);   

        myled = 0;  
        //200ミリ秒まつ
        wait_ms(250);

    }//while


}//main

//容量削減
void error(const char* format, ...){}




改良まえ


#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//1000の割り算 だいたい正しい
#define DVI1000(n) ((n>>10)+(((n>>10)*32)>>10))

#define HIGH 1
DigitalIn in1(PA_0);

DigitalOut led1(PA_4); //debug

RawSerial pc(PA_2, PA_3); //010 tx, rx

//タイマーの設定
Timer t;

//in1のオン時間をusで測る 今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{

    while(in1 == 0) {}

    led1 = 1;//debug

    t.start();
    t.reset();
    while(in1 != 0) {}
    t.stop();

    led1 = 0;//debug

    return(t.read_us());

}//pulseIn

int main() {

    int pwmco2;

    while(1){

        //PWMでデータ取得
        pwmco2=pulseIn(7 ,HIGH,2000000);
        printf("The time taken was %d seconds\r\n", pwmco2  );
        printf("The time taken was %d seconds\r\n", DVI1000(pwmco2)  );

        //0.1秒待つ
        wait_ms(100);

    }//while

}//main