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


x mbed2のリビジョン143

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

結果


![pwm_hz_82ms_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/00720e58-80f1-36e6-bc2f-607a57c96e88.jpeg)


忙しい人よう


https://os.mbed.com/users/caa45040/code/pulseIn_010_2/



![o_con63.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9da9caf3-b138-7737-9c48-287d8fe15317.jpeg)




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


```c++

#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



```


テストプログラム

```c++


#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, ...){}




```



改良まえ

```c++

#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



```
![o_con63.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bd682f6a-0a82-ffe3-a964-a307c794800a.jpeg)