示例#1
0
        private void ButtonCalc_Click(object sender, RoutedEventArgs e)
        {
            CalculationResult result = c.calculate(state.F1, state.GetPrescaler(), state.Delta, state.DeltaWidth);

            DataGridElement.applyResult(result);
            state.CalculationChanged();
        }
示例#2
0
        public static void applyResult(CalculationResult result)
        {
            systemClockPrescaler.Value = result.clock_prescaler.ToString();
            mainClock.Value            = result.main_clock.ToString();

            freqF1.Value   = result.freq_F1.ToString();
            periodF1.Value = result.period_F1.ToString();
            dutyF1.Value   = result.duty_F1.ToString();

            freqF0.Value   = result.freq_F0.ToString();
            periodF0.Value = result.period_F0.ToString();
            dutyF0.Value   = result.duty_F0.ToString();

            freqF2.Value        = result.freq_F2.ToString();
            periodF2.Value      = result.period_F2.ToString();
            dutyF2_start.Value  = result.duty_F2_start.ToString();
            dutyF2_stop.Value   = result.duty_F2_stop.ToString();
            width_time.Value    = result.widthTime.ToString();
            width_half_F1.Value = result.widthTimeF1.ToString();
        }
示例#3
0
        public const int maxPeriod = 0xFFFF;   //разрешение таймера

        public CalculationResult calculate(int freq, int prescaler, double delta, double width)
        {
            /*
             * u32 freq=(u32)((float)Env.pwmFreq/100.0F);
             * if (freq%2!=0)freq--;//четная частота
             * freq/=2;//чтобы в этот период влезла вдвое ниже частота
             * u16 prescaler=1;
             * while ((SystemCoreClock/(freq*prescaler))>maxPeriod) prescaler++;
             * int clock=SystemCoreClock/prescaler;
             * u16 period=clock/freq;
             * period/=2;
             */


            if (prescaler % 2 != 0)
            {
                MessageBox.Show("prescaler должен быть четным");
                return(null);
            }

            if (freq % prescaler != 0)
            {
                while ((freq % prescaler != 0))
                {
                    freq--;
                }
                MessageBox.Show("ближайшая частота " + freq);
            }

            //теперь мы уверены что частота и предделитель кратны
            CalculationResult result = new CalculationResult();

            result.clock_prescaler = 1;
            while ((clock / (freq * prescaler)) >= maxPeriod)
            {
                result.clock_prescaler++;                                              //2
            }
            result.freq_F1 = freq;

            if (result.clock_prescaler % 2 != 0)
            {
                result.clock_prescaler++;
            }
            result.main_clock = clock / result.clock_prescaler;//12 000 000

            //к примеру при частоте 300кГц и предделителе 2 будет 40
            result.period_F1 = clock / freq;//40
            if (result.period_F1 % 2 != 0)
            {
                result.period_F1--;
            }
            result.duty_F1 = 50.0F;

            //F0
            int multipF0 = prescaler * 2;

            result.freq_F0   = result.freq_F1 / multipF0;
            result.duty_F0   = 50.0F;
            result.period_F0 = result.period_F1 * multipF0;

            //F2
            result.freq_F2   = result.freq_F1 / prescaler;
            result.period_F2 = result.period_F1 * prescaler;
            double periodsPerPercent = (double)result.period_F2 / 100F;

            result.duty_F2_start = (int)(delta * periodsPerPercent);
            result.duty_F2_stop  = (int)((delta + width) * periodsPerPercent);
            //сколько периодов в проломе
            int periodsPegGap = result.duty_F2_stop - result.duty_F2_start;
            //сколько наносекунда длится период на этой частоте
            double f2TimeNano = (1.0F / result.freq_F2) * 1000000000;
            //время одного периода
            double periodTimeF2 = f2TimeNano / result.period_F2;

            //ширина пролома в наносекундах
            result.widthTime = (int)(periodsPegGap * periodTimeF2);

            //ширина полпериода F1
            double f1TimeNano = (1.0F / result.freq_F1) * 1000000000;
            //время одного периода
            double periodTimeF1 = f1TimeNano / result.period_F1;

            //время одного периода
            result.widthTimeF1 = (int)(0.5F * periodTimeF1);

            return(result);
        }