ボリューム調整により0~100%が出せます。
R_ADC_Get_Result(&ADC_buffer);速度ボリュームの値を読んで(10bit) ADC_buffer = ADC_buffer*20;ここで20倍して周期レジスタの値に合うよう調整 if(ADC_buffer>20000) ADC_buffer=20000;MAXの値を決めて(20000) if(ADC_buffer<0) ADC_buffer=0; EI(); TDR01H = ADC_buffer>>8;ここと TDR01L = ADC_buffer & 0x0F;ここを変化させる DI();
倍数とMAX値の数値3個を変更します。今ここの値は1m秒周期です。20m秒の場合 50,51000,51000 に変更すると0~100%に変化します。 20m秒設定時に生成される r_cg_tau.c 内の関数 void R_TAU0_Create(void) に TDR00H = _C3_TAU_TDR00H_VALUE; TDR00L = _4F_TAU_TDR00L_VALUE;と TDR01H = _61_TAU_TDR01H_VALUE; TDR01L = _A8_TAU_TDR01L_VALUE;という記述が見られますが、これが1msecで生成した周期とデューティです。TDR00HのhiがC3でloが4Fですので 16進C34F、10進では49999これが周期に相当します。TDR01H:61 TDR01L:A8 61A8ー>25000(デューティ50%)となります。プログラム中で このTDR01HとLをボリューム読み取り値に応じて変化させています。したがってMAXで50000、MINでは0にします。(MCUクロックが20MHz :周期0.05μ秒ですからtauもこの周期だとすると25m秒周期になりそうですが・・・。疑問は残ります。誰か教えていただくと有り難いです。) TDR00HとLを変化させれば周期も可変です。
ついでにラジコンサーボの0.5~2.4msecを出すには周期20m秒に設定してR_ADC_Get_Result(&ADC_buffer); ADC_buffer = ADC_buffer*5 + 1250; //最小パルス幅 if(ADC_buffer>6000) ADC_buffer=6000; //最大パルス幅 if(ADC_buffer<0) ADC_buffer=0;
にしますと0.5~2.4が出ています
Copyright © 面白半分